c - 取消引用对指向数组的指针有何作用?
问题描述
取消引用时指向元素数组的指针返回地址。由于它保存数组第一个元素的地址,因此取消引用它应该返回一个值。
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 返回数组的基地址,它不应该返回该地址的值吗?
解决方案
为什么 *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
),那么您将获得第一个元素的值。
推荐阅读
- github - 要求在没有“写”权限的分支保护规则中进行 PR 审查
- autodesk - 如何获取 Revit 模型的大样本文件(2-3GB)
- django - 一段时间后从模型 django 中删除数据
- arm - 是否应该为互斥锁获取-交换循环(或队列获取-加载循环)组合内存栅栏,还是应该避免?
- gap-system - 处理列表中的漏洞 [GAP SYSTEM]
- node.js - 检查nodejs中是否存在变量
- html - 当我从 HTML 中的第一个下拉框中选择一个选项时,如何在下拉框中获取多个选项
- java - 加载图像时 RecyclerView 滞后
- android - Android 将数据从通知传递到活动
- algorithm - 随机算法总是给出近似结果吗?为什么?为什么不?