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