我知道二維陣列基本上是指向陣列的指標,所以在下面的代碼中,a 是指向第 0 個索引的指標,該索引本身就是一個陣列,而不是 *a 應該回傳第 0 個索引元素的地址 a 和 *a 如何都回傳相同的值
#include <stdio.h>
#include <stdio.h>
int main () {
int a[4] [5] = {{1, 2, 3, 4, 5},
{6, 7,8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17,18, 19, 20}};
printf("%d\n",a);
printf("%d\n",*a);
}
uj5u.com熱心網友回復:
對于初學者輸出指標的值,您應該使用轉換說明符%p而不是%d.
printf( "%p\n", ( void * )a );
printf( "%p\n", ( void * )*a) ;
a用作引數運算式的陣列指示符被隱式轉換為指向其第一個元素的指標。由于陣列宣告為二維陣列,如
int a[4] [5] = {{1, 2, 3, 4, 5},
{6, 7,8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17,18, 19, 20}};
那么它的元素具有型別int [5] 和int ( * )[5]陣列隱式轉換到的指標(具有型別)將具有陣列的第一個“行”的地址,即陣列占用的記憶體范圍的初始地址。
取消參考指標,您將獲得第一個“行”,即a[0]型別的陣列int [5]。再次用作引數運算式,它被隱式轉換為指向int *其第一個元素的型別的指標a[0][0]。并且輸出第一個“行”的第一個元素的地址,即陣列所占用記憶體范圍的起始地址。
也就是說,整個陣列的地址、其第一個“行”的地址和第一個“行”的第一個元素的地址彼此相等。但是對應的運算式, &a, a, *a(隱式轉換為指標后)有不同的型別。運算式&a具有型別int ( * )[4][5],運算式a(隱式轉換之后)具有型別int ( * )[5],運算式*a(也在隱式轉換之后)具有型別int *。但他們的價值觀是平等的。
uj5u.com熱心網友回復:
我知道二維陣列基本上是指向陣列的指標
不它不是。大多數運算式中使用的陣列“衰減”到指向第一個元素的指標,但這不會使陣列成為指標。
所以在下面的代碼中 a 是指向第 0 個索引的指標
僅在運算式printf("%d\n",a);wherea衰減為指向其第一個元素的指標。的第一個元素a是一個型別為 的陣列int [5],所以在這個 printf 運算式中,a衰減到一個指向這樣一個元素的指標,一個int (*)[5]型別。
使用%d列印指標不是明確定義的行為,因此代碼是錯誤的,您應該使用%p并將引數轉換為void*:printf("%p\n", (void*)a);
a 和 *a 如何回傳相同的值
對于任何陣列,陣列本身和它的第一個元素自然位于相同的地址,否則陣列的概念沒有任何意義。陣列的定義是在連續地址分配的具有相同型別的連續專案塊。
當您取消參考時*a,您取消參考衰減a的 type陣列int(*)[5]并獲得一個 type int [5]。但是由于陣列不能在大多數運算式中使用,因此這也可以說是衰減為指向第一個元素的指標int [5],即 type int*,指向第一個陣列中的項 [0]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/346325.html
