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