陣列名的理解

2021-06-21 10:00:45 字數 2896 閱讀 3196

一:一維陣列int a[5]

陣列名a代表陣列首元素的位址,其型別為int *型別.

注意:和sizeof搭配使用,a表示整個陣列整體,sizeof(a) = 5 * 4.

&a:對一維陣列名取位址,其指向整個陣列,所以其型別為int (*)[5],指向整個一維陣列的指標,如果你將它賦值給乙個指標變數時只能賦值給乙個 int(*p)[5];否則一般的編譯器都會給出警告.所以sizeof(&a) = 4.

*a:對陣列第0個元素的解引用,就是a[0],所以sizeof(*a) = 1 * 4.

補充:對 a,&a 用%p列印,得到的值是相同的,因為它們所指向的空間的起始位址是相同的,但是它們所指向的空間大小不同.

二:二維陣列名 int b[3][4]

陣列名b代表陣列首元素的位址,但是這裡的首元素位址指的是第0行一維陣列的位址,b = &b[0],其型別為int (*)[4],表示指向一維陣列的指標.

注意:和sizeof搭配使用,a表示整個陣列整體,sizeof(b) = 3 * 4 * 4.

&b:對二維陣列名取位址,其指向整個陣列(對陣列名使用&得到指向範圍更大的指標),所以其型別為int (*)[3][4],但本身仍是乙個指標,sizeof(&b) = 4,

&b指向整個二維陣列,所以&b+1表示指向下個二維陣列

*b:難點

b是指向一維陣列的指標,對於二維陣列而言這個乙個行指標,解引用*一下表示列指標(對陣列名使用*得到指向範圍更小的指標),指向二維陣列的單個元素,所以*b的本質上也是個指標,其型別int *.

但是當與sizeof搭配使用時,表示一維陣列本身,可以這樣理解:

b是指向一維陣列的指標,*b就表示這個一維陣列本身,所以sizeo(*b) = 4 * 4;b[0]:表示指向第0行的一維陣列的陣列名,所以b[0]指向這個一維陣列首元素b[0][0]b[0] = *(b + 0) = *b, b表示指向第0行陣列的行指標,*(b + 0)對行指標解引用為列指標,表示指向第0行第0列的元素的指標,其指標型別為int *.反過來&b[0] = b + 0,對列指標&為行指標(對陣列指標&得到範圍更大的指標)但是sizeof(b[0]) == 4 * 4,  b[0]表示第0行的一維陣列名,對陣列名用sizeof表示一維陣列整體的大小

補充:對 b,&b,  *b 用%p列印,得到的值是相同的,因為它們所指向的空間的起始位址是相同的,但是它們所指向的空間大小不同.

例題:

#include #include int main(void)

; strcpy(a[0], "hello");

strcpy(a[1], "world");

printf("%d\n", sizeof(&a)); //4

printf("%d\n", sizeof(a)); //60

printf("%d\n", sizeof(*a)); //20 * 1 //a為一維陣列 20

printf("%c\n", *(*a + 1)); //e

printf("%s\n", *(a + 1)); //world

printf("%d\n", sizeof('s')); //4

return 0;

}

int main(void)

, };

int b[3] = ;

//char c[2][3] = ,};

printf("%d\n", sizeof(&b)); //4

printf("%d\n", sizeof(&a)); //4

printf("%d\n", sizeof(a)); //6

printf("%d\n", sizeof(*a)); //3

printf("%c\n", *(*a + 1)); //顯示亂碼,因為字元陣列存放的是整數,所以不能用%c列印,要用%d

printf("%s\n", *(a + 1)); //顯示亂碼,因為字元陣列存放的是整數,所以不能用%s列印 ,只有存放的是字元才可以這樣使用

//printf("%d\n", sizeof('s')); //4

return 0;

}

int main(void)

, };

int b[3] = ;

printf("%d\n", sizeof(&b)); //4

printf("%d\n", sizeof(&a)); //4

printf("%d\n", sizeof(a)); //4 * 6

printf("%d\n", sizeof(*a)); //3 * 4

printf("%d\n", sizeof(b)); //3 * 4

printf("%d\n", sizeof(*b)); //1 * 4

printf("\n");

printf("%d\n", sizeof(a[0])); //3 *4

printf("%d\n", *a[0]); //0

#if 0

printf("%p\n", a);

printf("%p\n", &a);

printf("%p\n", *a);

printf("%p\n", b);

printf("%p\n", &b);

#endif

printf("%d\n", (**(&a + 1))[-1]); //&a + 1指向下個二維陣列,(&a + 1))[-1]往上移動移動乙個位址,得到的是指向起始位址空間內容為5,大小為二維陣列大小的空間

//解引用*一下得到的是指向起始位址空間內容為5,大小為一維陣列大小的空間,再解引用*一下得到的就是指向起始位址空間內容為,大小為乙個元素大小的空間

return 0;

}

c語言中陣列名和陣列名取位址理解

1 陣列名是個指標型常量,也就是值不能被改變。指標常量和常量指標區別見本文 char str hello char ch 6 hello ch str 錯誤,常量不能被賦值,正如 1 2,字面值常量1被賦值為2一樣錯誤。char ch 2 定義後,陣列名相當於char const ch 0x.ch就...

陣列名和陣列名的取址

關於陣列名和指標的區別 推薦看這兩篇文章 示例 char a 3 輸出10進製位址 輸出 a 為 2686777 a 為 2686777 a是陣列名,編譯器處理時相當於陣列首元素的位址 a是乙個指向陣列的指標,值為陣列的位址,等於陣列首元素的位址 輸出 a 為 1 a 為 1 a 為 2686777...

sizeof 陣列名 及strlen(陣列名)

程式的輸出結果為 1 100 2 4 3 1 相當於a 100 這個數所佔的位元組大小,也就是乙個char位元組占得大小 當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。不論陣列a的容量是多少,sizeof a 始終等於sizeof char func char p int main ...