首先做這些練習前我們要明白陣列名的意義:
1. sizeof(陣列名),這裡的陣列名表示整個陣列,計算的是整個陣列的大小,單位是位元組。
2. &陣列名,這裡的陣列名表示整個陣列,取出的是整個陣列的位址。
3. 除此之外所有的陣列名都表示首元素位址。而位址的大小都是4(32為平台)/8(64位平台)個位元組。
ps:本篇為32位平台下執行結果
一維陣列:
int a = ;
printf("%d\n",sizeof(a)); //16
屬於第1種情況,表示整個陣列的大小,為16個位元組
printf("%d\n",sizeof(a+0)); //4
表示首元素位址,大小為4個位元組
printf("%d\n",sizeof(*a)); //4
首元素位址解引用,表示首元素,大小為4個位元組
printf("%d\n",sizeof(a+1)); //4
表示首元素位址+1,即第二個元素位址,大小為4個位元組
printf("%d\n",sizeof(a[1])); //4
表示第二個元素,大小為4個位元組
printf("%d\n",sizeof(&a)); //4
表示整個陣列的位址,大小為4個位元組
printf("%d\n",sizeof(*&a)); //16
對陣列的位址解引用,表示整個陣列的大小,為16個位元組
printf("%d\n",sizeof(&a+1)); //4
表示跳過整個陣列的下乙個陣列的位址,大小為4個位元組
printf("%d\n",sizeof(&a[0])); //4
表示首元素位址,大小為4個位元組
printf("%d\n",sizeof(&a[0]+1)); //4
表示首元素位址+1,即第二個元素位址,大小為4個位元組
字元陣列
char arr = ; (沒有 \0字元)
printf("%d\n", sizeof(arr)); //6
表示6個位元組,有6個元素
printf("%d\n", sizeof(arr+0)); //4
表示首元素位址,大小為4個位元組
printf("%d\n", sizeof(*arr)); //1
首元素位址解引用,表示首元素,大小為1個位元組
printf("%d\n", sizeof(arr[1])); //1
表示第二個元素,大小為1個位元組
printf("%d\n", sizeof(&arr)); //4
表示取陣列的位址,大小為4個位元組
printf("%d\n", sizeof(&arr+1)); //4
表示跳過乙個陣列下乙個陣列的位址,大小為4個位元組
printf("%d\n", sizeof(&arr[0]+1)); //4
表示第二個元素的位址,大小為4個位元組
printf("%d\n", strlen(arr)); //隨機值x
strlen求字串長度,傳的是位址,遇到\0的位置不確定,arr表示首元素位址
printf("%d\n", strlen(arr+0)); //隨機值x
遇到\0的位置不確定,arr表示首元素位址
printf("%d\n", strlen(*arr)); //錯誤
*arr是97作為位址傳進去,97作為位址以後的空間不允許訪問
printf("%d\n", strlen(arr[1])); //錯誤同上
printf("%d\n", strlen(&arr)); //隨機值x
遇到\0的位置不確定,arr表示首元素位址
printf("%d\n", strlen(&arr+1)); //隨機值y x-y=6
跳過乙個陣列下乙個陣列的位址
printf("%d\n", strlen(&arr[0]+1)); //隨機值 w x-w=1
從第二個元素向後數, 遇到\0的位置不確定
char arr = "abcdef"; (有\0字元)
printf("%d\n", sizeof(arr)); //7
表示陣列的大小,7個位元組
printf("%d\n", sizeof(arr+0)); //4
arr是首元素位址,大小為4個位元組
printf("%d\n", sizeof(*arr)); //1
表示首元素,大小為1個位元組
printf("%d\n", sizeof(arr[1])); //1
表示第二個元素,大小為1個位元組
printf("%d\n", sizeof(&arr)); //4
表示陣列的位址,大小為4個位元組
printf("%d\n", sizeof(&arr+1)); //4
表示跳過乙個陣列到下乙個陣列的位址,大小為4個位元組
printf("%d\n", sizeof(&arr[0]+1)); //4
表示第二個元素的位址,大小為4個位元組
printf("%d\n", strlen(arr)); //6
表示字串長度,大小為6
printf("%d\n", strlen(arr+0)); //6
表示字串長度,大小為6個
printf("%d\n", strlen(*arr)); //錯誤
*arr是97作為位址傳進去,97作為位址以後的空間不允許訪問
printf("%d\n", strlen(arr[1])); //錯誤同上
printf("%d\n", strlen(&arr)); //6
陣列的位址和首元素位址值一樣,從第乙個元素開始數,大小為6
printf("%d\n", strlen(&arr+1)); //隨機值
表示跳過乙個陣列下乙個陣列的位址,遇到\0的位置不確定
printf("%d\n", strlen(&arr[0]+1)); //5
從第二個元素開始數,大小為5
char *p = "abcdef"; //將常量字串的a放到指標變數p中
printf("%d\n", sizeof(p)); //4
指標變數的大小,為4個位元組
printf("%d\n", sizeof(p+1)); //4
b的位址的大小,為4個位元組
printf("%d\n", sizeof(*p)); //1
首元素a字元的大小,為1個位元組
printf("%d\n", sizeof(p[0])); //4
p[0] == *(p+0) 大小為1個位元組
printf("%d\n", sizeof(&p)); //4
指標變數的位址,大小為4個位元組
printf("%d\n", sizeof(&p+1)); //4
還是位址,大小為4個位元組(跳過乙個char*(指標型別))
printf("%d\n", sizeof(&p[0]+1)); //4
第二個元素位址,大小為4
printf("%d\n", strlen(p)); //6
p存放a的位址,往後數大小為6
printf("%d\n", strlen(p+1)); //5
p+1存放b的位址,往後數大小為5
printf("%d\n", strlen(*p)); //錯誤
*p是97作為位址傳進去,97作為位址以後的空間不允許訪問
printf("%d\n", strlen(p[0])); //錯誤
p[0]相當於*p
printf("%d\n", strlen(&p)); //隨機值
遇到\0的位置不確定
printf("%d\n", strlen(&p+1)); //隨機值
遇到\0的位置不確定
printf("%d\n", strlen(&p[0]+1)); //5
b的位址往後數,大小為5
二維陣列
int a[3][4] = ;
printf("%d\n",sizeof(a)); \\48
表整個陣列的大小,為48個位元組
printf("%d\n",sizeof(a[0][0])); \\4
表示第一行第一列的元素的大小,為4個位元組
printf("%d\n",sizeof(a[0])); \\16
第一行陣列名單獨放在sizeof內部,表示第一行元素的大小,為16個位元組
printf("%d\n",sizeof(a[0]+1)); \\4
第一行第乙個元素位址加1為 第一行第二個元素的位址,大小為四個位元組
printf("%d\n",sizeof(*(a[0]+1))); \\4
第一行第二個元素大小,為4個位元組
printf("%d\n",sizeof(a+1)); \\4
首元素(第一行)位址加1 為第二行的位址,大小為4
printf("%d\n",sizeof(*(a+1))); \\16
第二行元素的大小,為16個位元組
printf("%d\n",sizeof(&a[0]+1)); \\4
第一行的陣列名取位址是第一行的位址 加1是第二行的位址,大小為4個位元組
printf("%d\n",sizeof(*(&a[0]+1))); \\16
第二行元素大小,為16個位元組
printf("%d\n",sizeof(*a)); \\16
第一行的大小,為16個位元組 *(a+0)== a[0]
printf("%d\n",sizeof(a[3])); \\16
sizeof內部表示式不參與運算,算的是一行的元素的大小,不存在越界。大小為16個位元組。
指標和陣列相關的練習題。
前幾天學完了指標,今天就來做一些經典的題來鞏固自己的知識。1.int main int ptr int a 1 printf d,d a 1 ptr 1 return 0 解析 首先這道題答案是2,5.因為首先它先定義乙個陣列,然後定義乙個指標變數指向下乙個陣列。a 1表示對第二個元素的位址,在解引...
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...