一、陣列
1、int arr[10]=;中
arr為該陣列的陣列名,10為陣列所佔空間,{}中為陣列內容,int[10]表示陣列型別。
2、陣列定義時若是初始化,則arr後必須註明次數組需用多少空間,表示將陣列中第乙個元素初始化為零,其餘元素預設為0。
3、陣列沒定義大小時必須在後邊註明內容。
4、中必為常量,不可為變數。
5、int arr1[10]=為整形陣列,char arr3=為字元陣列。
6、陣列大小計算sz=sizeof(arr)/sizeof(arr[0])。
二、指標
1、指標是乙個用來存放位址的變數。
2、對於一維陣列,除了sizeof(arr)\&arr外,其餘的都代表陣列首元素的位址。
三、sizeof
//整形陣列
printf("%p\n", &a);printf("%p\n", &a+1);
printf("%d\n", sizeof(*&a));
//&a表示整個陣列的位址,加上*表示整個陣列,這是乙個包含四個元素的整型陣列,所以佔16個位元組。
printf("%d\n",sizeof(a));//16
//陣列名單獨放到sizeof中時代表整個陣列,因此sizeof(a)代表整個陣列所佔的記憶體,而這個陣列a是乙個整型陣列每個元素佔四個位元組,四個元素總共佔16個位元組。
printf("%d\n",sizeof(a+0));//4
//陣列名非單獨放到sizeof中使用時代表陣列首元素位址,因此sizeof(a+0)代表陣列a中首 元素位址所佔的記憶體,乙個位址佔四個位元組。
printf("%d\n",sizeof(*a));//4
//同上,a代表首元素位址,而*a代表首元素,整型陣列乙個元素佔四個位元組,所以sizeof(*a)佔四個位元組。
printf("%d\n",sizeof(a+1));//4
//a在sizeof中非單獨使用,代表首元素位址,a+1代表第二個元素的位址,所以也佔四個位元組。
printf("%d\n",sizeof(a[1]));//4
//a[1]代表陣列中第二個元素,整型陣列每個元素佔四個位元組。
printf("%d\n",sizeof(&a));//4
//a單獨出現在&後邊時代表整個陣列,&a就代表著整個陣列的位址,因為是位址,所以佔四個位元組。
printf("%d\n",sizeof(*&a));//16
//上述,a單獨出現在&後面時,代表整個陣列,&a表示整個陣列的位址,加上*代表整個陣列,即*&a代表整個陣列所有的元素,佔16位元組。
printf("%d\n",sizeof(&a+1));//4
//&a代表整個陣列的位址,之後加1,程式設計整個陣列後面的位址,因為是位址,佔四個位元組。
printf("%d\n",sizeof(&a[0]));//4
//a[0]陣列中第乙個元素,取位址佔四個位元組。
printf("%d\n",sizeof(&a[0]+1));//4
//a[0]+1陣列中第二個元素,取位址,佔四個位元組。
//字元陣列
char arr = ;
printf(「%d\n」, sizeof(arr));//6
//陣列名單獨存在於sizeof後面代表整個陣列,因為是字元陣列,陣列中每個元素佔乙個位元組,所以6各元素總共佔6個位元組。
printf(「%d\n」, sizeof(arr+0));//4
//陣列名非單獨作用於sizeof後,代表陣列首元素位址,首元素位址加上0還是首元素位址,佔四個位元組。
printf(「%d\n」, sizeof(*arr));//1
//同理 arr代表首元素位址,*arr代表首元素,因為是字元陣列,乙個元素佔乙個位元組。
printf(「%d\n」, sizeof(arr[1]));//1
//arr[1]表示陣列第二個元素,字元陣列乙個元素佔乙個位元組。
printf(「%d\n」, sizeof(&arr));//4
// &arr 代表整個陣列的位址,佔四個位元組。
printf(「%d\n」, sizeof(&arr+1));//4
// &arr+1代表整個陣列後面相連的位址,佔四個位元組。
printf(「%d\n」, sizeof(&arr[0]+1));//4
//&arr[0]陣列首元素的位址,加上1後表示陣列第二個元素的位址,佔四個位元組。
char arr = 「abcdef」;//[a b c d e f \0]
printf(「%d\n」, sizeof(arr));//7
//當使用乙個字串來給乙個字元陣列初始化時,系統會預設給字串後面加上\0,也就是說這個字元陣列中的元素,會比看到的abcdef元素多乙個元素,所以陣列中是有7個元素的,字元陣列每個元素佔乙個位元組,所以整個陣列佔7個位元組。
printf(「%d\n」, sizeof(arr+0));//4
// 陣列名非單獨作用於sizeof函式後,僅作陣列首元素的位址,加上0還是首元素位址,位址佔4個位元組。
printf(「%d\n」, sizeof(*arr));//1
//*arr 作為整個字元陣列的首元素,佔1個位元組。
printf(「%d\n」, sizeof(arr[1]));//1
// arr[1]字元陣列的第二個元素,佔1個位元組。
printf(「%d\n」, sizeof(&arr));//4
// 整個字元陣列的位址,佔4個位元組。
printf(「%d\n」, sizeof(&arr+1));//4
// &arr+1,表示整個字元陣列後面相連的那個位址,位址佔1個位元組。
printf(「%d\n」, sizeof(&arr[0]+1));//4
//字元陣列首元素位址加1,也就是陣列的第二個元素的位址,佔1個位元組。
//strlen 求乙個字串的長度,當作用於乙個字元陣列時,即從這個字元陣列的首元素位址開始向後檢查,每遇到乙個字元則加1,直到遇到\0,或者null時停止,不然會生成隨機數。
printf("%d\n", strlen(arr));//x
//x表示隨機數,因為陣列中沒有『\0』和null,所以函式strlen會一直向後面的位址檢索,會生成隨機數。
printf("%d\n", strlen(arr+0));//x
// 原因同上述
printf("%d\n", strlen(*arr));//err
//err 錯誤,程式崩潰,因為*arr表示字元陣列的首元素字元a,a的ascii碼會被當做位址賦給strlen函式,函式在讀取時會發生錯誤。而致使程式崩潰。
printf("%d\n", strlen(arr[1]));//err
// 原因同上,arr[1]是字元陣列的首元素。
printf("%d\n", strlen(&arr));//x
// 因為strlen函式執行時,無法檢索到\0和null,所以會生成隨機數。
printf("%d\n", strlen(&arr+1));//x
//原因同上
printf("%d\n", strlen(&arr[0]+1));//x
//原因同上
c語言中陣列與sizeof
我以前的理解是 陣列名字就是指向陣列首元素的指標,然而用sizeof 運算元組名字,把我又弄得有些疑惑了。查了查資料,終於明白了。原來,陣列名字做形參時才被當作指標。而sizeof 並不是乙個函式,而是乙個單目運算子,所以sizeof 裡寫陣列名字,返回的就是陣列佔了多少位元組。例如 char a ...
sizeof 二維陣列 C語言陣列
陣列的建立 在建立陣列時,我們必須定義陣列的型別和大小,陣列的大小不能為0,陣列中的元素型別都是相同的。int arr 10 int arr1 3 int arr2 在這裡,我們arr 3 裡邊的數字可以不用寫 int arr3 3 也是可以的,只是把最後乙個數初始化為0了而已int arr4 3 ...
嵌入式C語言陣列,str函式實現
陣列中所有的資料都是相同的資料型別 int a 10 陣列中的元素的首位址都是連續的 a 0 0x0000 a 1 0x0004 位數跟資料型別有關 c語言不允許使用變數的值進行動態定義,賦初值的方式 在定義時賦值 迴圈賦值 陣列與指標的聯絡 陣列的名字是可以當成指標使用的 a 陣列首元素的位址 陣...