例如,
int array[5] = {1}: // array of 5 integers
int (*ptr)[5] = &array; // pointer to an array of 5 integers
以下内容具有相同的值:
*ptr;
ptr;
如果我打电话给printf("%p, %p", *ptr, ptr);
,两个输出都会完全相同。这是为什么?
答案 0 :(得分:2)
在本声明中
int (*ptr)[5] = &array;
指针ptr由数组的地址初始化。数组的地址是第一行的第一个元素的地址。
表达
*ptr;
让您引用第一个元素到一维数组 - 第一行或更准确地说是原始数组..
反过来表达式数组被转换为指向其第一个元素的指针,而*ptr
等同于表达式array
被转换为指向数组{{1的第一个元素的类型指针的rvalue }}。:)
即表达式*ptr
将具有类型*ptr
第一行的地址和第一行的第一个元素的地址是相同的。
现在您有两个指针int *
和ptr
,第一个指针的类型为*ptr
,而第二个指针的类型为int ( * )[5]
,但两者的值相同。
答案 1 :(得分:1)
如果查看一维数组的内存布局,例如
int array[5];
这是有道理的。
array
|
V
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
array[0]
|
V
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
Address of array
|
V
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
Address of array[0]
|
V
+---+---+---+---+---+---+
| | | | | | |
+---+---+---+---+---+---+
即。 &array == &array[0] == array decayed to a pointer
将指针声明为:
int (*ptr)[5] = &array;
ptr == &array
*ptr == array decayed to a pointer == &array[0] == &array
这就是为什么你在使用时看到相同值的原因:
printf("%p, %p", *ptr, ptr);
答案 2 :(得分:1)
由于printf
是一个可变函数,ellipsis conversion sequences将应用于参数。特别是,数组是decayed指向底层类型的指针:IOW,它被隐式转换为指向数组第一个元素的指针。因此,当您致电printf("%p, %p", *ptr, ptr);
时,类型为*ptr
的{{1}}会转换为值int[5]
的{{1}}。