c語言陣列、sizeof()及strlen()
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[] = {‘a’,’b’,’c’,’d’,’e’,’f’};
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 和strlen 的原理及兩者的區別C語言字元陣列
- C語言中的strlen與sizeof的區別C語言
- sizeof 和 strlen 計算陣列大小和長度詳解陣列
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- C語言陣列C語言陣列
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- C/C++——sizeof和strlen的區別C++
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- c語言的陣列C語言陣列
- C語言(字元陣列)C語言字元陣列
- c語言字元陣列C語言字元陣列
- [ASM C/C++] C語言陣列ASMC++C語言陣列
- C語言sizeof()變數、字元、字串C語言變數字元字串
- C語言 sizeof函式詳解C語言函式
- C語言 指標與陣列C語言指標陣列
- C語言基礎-1、陣列C語言陣列
- sizeof與strlen的區別
- sizeof 與 strlen 的區別
- strlen與sizeof的區別
- 用C語言寫strcat、strcpy、strlen、strcmpC語言
- C語言 簡單的佇列(陣列佇列)C語言佇列陣列
- C語言陣列求學生成績C語言陣列
- c語言-運算子,陣列,指標C語言陣列指標
- C語言動態陣列小作業C語言陣列
- C語言指標和陣列基礎C語言指標陣列
- C語言:陣列和指標的區別C語言陣列指標
- C語言求其字元陣列的長度C語言字元陣列
- go 語言陣列Go陣列
- C語言結構體及函式傳遞陣列引數示例C語言結構體函式陣列
- C語言-字串函式的實現(一)之strlenC語言字串函式
- C語言指標和陣列筆試題C語言指標陣列筆試
- C語言陣列實現三子棋C語言陣列
- C語言 二維陣列課題程式碼C語言陣列
- C語言如何計算陣列的長度C語言陣列
- C語言雜談:指標與陣列 (上)C語言指標陣列
- C語言雜談:指標與陣列 (下)C語言指標陣列
- C語言雜談:指標與陣列(下)C語言指標陣列
- C語言程式設計基礎:指標陣列與陣列指標C語言程式設計指標陣列