去引用如何作用于指向数组的指针?

Aka*_*ash 2 c pointers

取消引用时指向元素数组的指针返回一个地址。由于它保存着数组第一个元素的地址,因此对其取消引用应该返回一个值。

int arr[] = { 3, 5, 6, 7, 9 }; 
int *p = arr; 
int (*ptr)[5] = &arr;     
printf("p = %p, ptr = %p\n", p, ptr); 
printf("*p = %d, *ptr = %p\n", *p, *ptr);
Run Code Online (Sandbox Code Playgroud)

输出:

p = 0x7fff6ea72d10,ptr = 0x7fff6ea72d10

* p = 3,* ptr = 0x7fff6ea72d10

* ptr为什么返回数组的基地址,为什么不返回该地址的值呢?

Dav*_*ica 8

* ptr为什么返回数组的基地址,为什么不返回该地址的值呢?

(p3)除非它是运算sizeof符,_Alignof运算符或一元运算'&'符的操作数,或者是用于初始化数组的字符串文字,否则类型为“ array of type”的表达式将转换为类型为“指向类型的指针”,它指向数组对象的初始元素,而不是左值。C11标准-6.3.2.1其他操作数-左值,数组和函数指示符(p3)

int (*ptr)[5] = &arr;
Run Code Online (Sandbox Code Playgroud)

ptr是的指向数组指针int [5]。取消引用时,ptr将得到的数组 int[5]。如何int[5]访问数组?

规则6.3.2.1提供了答案:

“类型数组”被转换为类型指针”的表达式,该表达式指向数组对象的初始元素...

现在,如果再次取消引用(例如**ptr),则将获得第一个元素的值。

  • 这是* type *值不同的问题。ptr是一个指向数组的指针。当您取消引用“ ptr”(例如“ * ptr”)时,将具有数组类型“ int [5]”。**两者都保存第一个元素的地址**,但是第一个是指针数组的指针,而第二个是int [5]数组的类型。因此,通过间接级别,您可以将对象作为不同类型进行访问,但是只要仍然存在间接级别,就不会访问该值。 (2认同)
  • 这样想,`ptr`保存第一个`int array [5]`的地址。那么,什么是“ int array [5]”呢?访问时使用的“ int array [5]”是第一个元素的地址-因此,它们都拥有相同的地址,即第一个元素的地址(但它们是完全不同的类型)。 (2认同)