首页 > 解决方案 > 取消引用对指向数组的指针有何作用?

问题描述

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

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);

输出:

p = 0x7fff6ea72d10,ptr = 0x7fff6ea72d10

*p = 3, *ptr = 0x7fff6ea72d10

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

标签: cpointers

解决方案


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

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

int (*ptr)[5] = &arr;

ptr是一个指向数组的指针int [5]。当您取消引用时,ptr您会得到 int[5]. 数组是如何int[5]访问的?

规则6.3.2.1提供了答案:

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

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


推荐阅读