摘要:也可以理解成二維數(shù)組有三個元素,每個元素是一個一維數(shù)組我們可以把二維數(shù)組想象成一個幾行幾列的數(shù)組但是本質(zhì)上的二維數(shù)組是一列的。數(shù)組名,計算整個數(shù)組的大小,內(nèi)部多帶帶放一個數(shù)組名,數(shù)組名表示整個數(shù)組。數(shù)組名,數(shù)組名表示整個數(shù)組。
目錄
數(shù)組是創(chuàng)建一組相同類型元素的集合。
數(shù)組的創(chuàng)建方式:
int arr [常量表達式];//int是指數(shù)組的元素類型,也可以是float,char這種類型。//在arr[]在[]中放的是常量表達式//在C99之前 —— arr[]中時不能用變量的,要用常量。
數(shù)組創(chuàng)建的實例:
char arr1[10];float arr2[1];double arr3[20];
如果只是創(chuàng)建數(shù)組(不初始化),然后使用數(shù)組,編譯器就會報錯,因為數(shù)組的值是不知道的。
數(shù)組的初始化是指,在創(chuàng)建數(shù)組的同時給數(shù)組的內(nèi)容一些合理初始值(初始化)。
#includeint main(){ //三種常見的初始化方式 int arr1[20] = { 1,2,3 };//這個數(shù)組的空間大小是20*4個字節(jié),前三個元素的值為1,2,3,其他的值默認為0 —— 不完全初始化 int arr2[] = { 1,2,3 };//這個數(shù)組的初始化雖然沒有給元素個數(shù),但是C語言的語法還是支持的,元素的個數(shù)是根據(jù){}中元素個數(shù)來給的//{}中有幾個元素,這個數(shù)組的空間大小就是多少 —— 空間大小為3*4個字節(jié) int arr3[3] = { 1,2,3 };//完全初始化 //理解下面三種數(shù)組初始化的含義 char arr4[] = "abc";//這個數(shù)組的空間大小為4個字節(jié),其中存放的是a b c /0 —— 字符串后面默認有一個/0?!伞啊币鸬膬?nèi)容//為字符串 char arr5[] = { "a", "b", "c" };//這個數(shù)組的空間大小為3個字節(jié),其中存放的是a b c char arr6[] = { "a", 98, "c" };//因為數(shù)據(jù)類型為char類型的,所以98代表的是b,b的ASCII值為98 return 0;}
對于數(shù)組的使用我們之前介紹了一個操作符:
[ ] ,下標(biāo)引用操作符 —— 它其實就數(shù)組訪問的操作符。
#include int main(){ int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //數(shù)組的不完全初始化 int sz = sizeof(arr) / sizeof(arr[0]); //計算數(shù)組的元素個數(shù) //對數(shù)組內(nèi)容賦值,數(shù)組是使用下標(biāo)來訪問的,下標(biāo)從0開始 printf("%d/n", arr[4]); //打印數(shù)字5; int i = 0; //利用循環(huán)打印數(shù)組的內(nèi)容 for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0;}
總結(jié):
1. 數(shù)組是使用下標(biāo)來訪問的,下標(biāo)是從0開始。
2. 數(shù)組的大小可以通過計算得到。
代碼:
#include int main(){ int arr[10] = { 0 }; int i = 0; //計算數(shù)組中的元素個數(shù) int sz = sizeof(arr) / sizeof(arr[0]; //打印數(shù)組元素的地址 for (i = 0; i < sz; ++i) { printf("&arr[%d] = %p/n", i, &arr[i]); } return 0;}
結(jié)果:
?結(jié)論:
從結(jié)果中我們可以看出來:隨著一維數(shù)組下標(biāo)的增長,元素的地址,也在有規(guī)律的遞增 —— (1)數(shù)組在內(nèi)存中是連續(xù)存放的? —— (2)數(shù)組中的地址是由高到低排序的
數(shù)組在內(nèi)存中的本質(zhì):
(1)數(shù)組在內(nèi)存中是連續(xù)存放的?
(2)數(shù)組中的地址是由高到低排序的
代碼舉例:
//打印數(shù)組中的內(nèi)容#includeint main(){ int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); int* p = arr; //定義指針變量為int類型//普通做法 for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("/n");//利用數(shù)組在內(nèi)存中是連續(xù)存放的規(guī)律 for (i = 0; i < sz; i++) { printf("%d ", *p); p++; //指針變量+1表示,跳過一個整型空間 } return 0;}
int arr[3][4];char arr[3][5];double arr[2][4];
//1int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10};
//2int arr[3][4] = { {1,2},{4,5} };
//3int arr[][4] = { {2,3},{4,5} };//二維數(shù)組初始化了,可以省略列數(shù)下標(biāo),但是不能省略行數(shù)下標(biāo)
//4char ch[3][4] = { "abc","bcd" };
二維數(shù)組的使用也是通過下標(biāo)的方式。
#include int main(){ int arr[3][4] = {0}; int i = 0;//對arr數(shù)組初始化賦值 for(i=0; i<3; i++) { int j = 0; for(j=0; j<4; j++) { arr[i][j] = i*4+j; } }//打印arr數(shù)組的內(nèi)容 for(i=0; i<3; i++) { int j = 0; for(j=0; j<4; j++) { printf("%d ", arr[i][j]); } } return 0;}
像一維數(shù)組一樣,這里我們嘗試打印二維數(shù)組的每個元素的內(nèi)存地址
#include int main(){ int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12,}; int i = 0;//打印數(shù)組arr的每一個元素的地址 for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("&arr[%d][%d] = %p/n", i, j, &arr[i][j]); } //%p —— 是打印地址 } return 0;}
?從上面的結(jié)果就可以看出:二維數(shù)組在內(nèi)存中也是連續(xù)存儲的。
也可以理解成:二維數(shù)組有三個元素,每個元素是一個一維數(shù)組
?我們可以把二維數(shù)組想象成一個幾行幾列的數(shù)組
但是本質(zhì)上的二維數(shù)組是一列的。 ———— 如上圖
數(shù)組內(nèi)存的本質(zhì):
(1)數(shù)組在內(nèi)存中是連續(xù)存放的?
(2)數(shù)組中的地址是由高到低排序的
代碼舉例:
#includeint main(){ int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; int i = 0; int* p = arr; //普通的打印方式 for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("%d ", arr[i][j]); } } printf("/n"); //利用本質(zhì)來打印數(shù)組 for (i = 0; i < 12; i++) { printf("%d ", *p); p++; } return 0;}
數(shù)組的下標(biāo)是有范圍限制的。
數(shù)組的下標(biāo)規(guī)定是從0開始的,如果輸入有n個元素,最后一個元素的下標(biāo)就是n-1。
所以數(shù)組的下標(biāo)如果小于0,或者大于n-1,就是數(shù)組越界訪問了,超出了數(shù)組合法空間的訪問。
C語言本身是不做數(shù)組下標(biāo)的越界檢查,編譯器也不一定報錯,但是編譯器不報錯,并不意味著程序就 是正確的,所以程序員寫代碼時,最好自己做越界的檢查。
代碼舉例:
#includeint main(){ int arr[5] = { 1,2,3,4,5 }; int i = 0; for (i = 0; i <= 5; i++) //其中的arr[5]越界訪問了 { printf("%d ", arr[i]); } return 0;}
?從上圖可知,越界訪問的值是系統(tǒng)給的隨機值。
?二維數(shù)組的行和列也可能存在越界 —— 在這里就不多講了
#include int main(){ int arr[10] = { 1,2,3,4,5 }; printf("%p/n", arr); printf("%p/n", arr+1); printf("%p/n", &arr[0]); printf("%d/n", *arr); //輸出結(jié)果 return 0;}
?從上面就可以看出:數(shù)組名是首元素的地址
有兩種例外的情況:數(shù)組名不是首元素的地址。
1. sizeof(數(shù)組名),計算整個數(shù)組的大小,sizeof內(nèi)部多帶帶放一個數(shù)組名,數(shù)組名表示整個數(shù)組。
2. &數(shù)組名,取出的是數(shù)組的地址。&數(shù)組名,數(shù)組名表示整個數(shù)組。
除此1,2兩種情況之外,所有的數(shù)組名都表示數(shù)組首元素的地址。
代碼演示:?
#include int main(){ int arr[10] = { 1,2,3,4,5 }; printf("%p/n", arr); printf("%p/n", &arr); printf("----------/n"); printf("%p/n", arr + 1); printf("%p/n", &arr + 1); return 0;}
?從結(jié)果中我們可以看到:
arr的地址加一 —— 數(shù)組的地址跳過 4
&arr的地址加一 —— 數(shù)組的地址跳過 40。
有不同的結(jié)果是因為:&arr表示的是整個數(shù)組的地址,arr表示的是數(shù)組第一個元素的地址
冒泡排序的原理:
冒泡排序代碼:?
#includevoid Sort(int arr[], int sz){ int i = 0; //每趟冒泡排序 for (i = 0; i < sz - 1; i++) { int j = 0; //一趟冒泡排序 for (j = 0; j < sz - i - 1; j++) { if (arr[j] > arr[j + 1]) { //交換 int tem = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tem; } } }}void Print(int arr[], int sz){ int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); }}int main(){ int arr[10] = { 7,8,9,4,5,6,1,2,3 }; int sz = sizeof(arr) / sizeof(arr[0]); //冒泡排序 Sort(arr, sz); //打印數(shù)組的內(nèi)容 Print(arr, sz); return 0;}
解析 —— 以前我寫過的一篇博客連接如下:
三子棋小游戲:? ?https://blog.csdn.net/IT_Infector/article/details/119216692
解析 —— 以前我寫過的一篇博客連接如下:
掃雷小游戲:? ?https://blog.csdn.net/IT_Infector/article/details/119224857???????
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/119301.html
摘要:變量占用個字節(jié)的空間,這里是將的個字節(jié)的第一個字節(jié)的地址存放在變量中,就是一個之指針變量。是指針變量作者新曉故知總結(jié)指針變量,用來存放地址的變量。 目錄 前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教! ???????? ? ? ?? ? ? ? ? ? ...
摘要:目錄前言前言前期的準(zhǔn)備前期的準(zhǔn)備游戲代碼的具體實現(xiàn)游戲代碼的具體實現(xiàn)完整版的掃雷小游戲代碼完整版的掃雷小游戲代碼總結(jié)總結(jié)前言掃雷是一款大眾類的益智小游戲,于年發(fā)行。 目錄 前言 前期的準(zhǔn)備 游戲代碼的具體實現(xiàn) 1、text.c 2、game.h 3、game.c 完整版的掃雷小游戲代碼: 1...
閱讀 1580·2021-11-25 09:43
閱讀 2683·2021-09-24 10:30
閱讀 3731·2021-09-06 15:02
閱讀 3678·2019-08-30 15:55
閱讀 3352·2019-08-30 15:53
閱讀 1760·2019-08-30 15:52
閱讀 2197·2019-08-30 14:21
閱讀 2066·2019-08-30 13:55