为什么以下具有相同的值:指向数组的指针,指向数组的解引用指针?

时间:2015-01-02 21:03:12

标签: c++ c pointers

例如,

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);,两个输出都会完全相同。这是为什么?

3 个答案:

答案 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}}。