c++ - 括号对数组指针有什么影响?
问题描述
在编写程序时,我发现
(*array3)[i]
不同于
*array3[i]
我真的不明白为什么。有人可以向我解释计算机中发生了什么吗?
第一个片段做了我想要的,即:通过数组索引。在最后一个片段中,首先完成索引,然后再取消引用。我怎样才能形象化呢?
int *array3 = nullptr;
void add(int *array1, int n1, int *array2, int n2, int **array3, int &n3){
n3 = std::max(n1,n2);
*array3 = new int[n3];
n3 可以是任意数字
第一个案例的图片:
解决方案
在(*array3)[i]
中,*
解引用运算符首先应用于array3
,然后将[]
下标运算符应用于结果。
在*array3[i]
中,这被视为*(array3[i])
因为下标运算符比解引用运算[]
符具有更高的优先级。*
因此,[]
首先将下标运算符应用于array3
,然后将*
运算符应用于结果。
现在,这些有什么不同?好吧,首先你必须明白一个语句P[N]
,其中P
是指向某种类型的指针T
,实际上与 相同*(P+N)
,即指针持有的地址增加元素N
数T
(即地址增加sizeof(T) * N
字节数) ,然后取消引用生成的地址。
假设array3
是一个指向int[]
数组的指针(因为您实际上没有显示 的声明array3
),即:
int array[5] = {...};
int (*array3)[5] = &array;
然后:
(*array3)[i]
本质上是*((*array3)+i)
.*array3
首先取消引用array3
以访问int[]
数组本身。引用数组本身将衰减为指向数组第一个元素的指针。所以现在我们有一个int*
指向int
数组第一个元素的指针,然后[i]
应用于该指针,将其增加元素i
数int
,然后取消引用以访问实际int
元素。*array3[i]
本质上是*(*(array3+i))
. 所持有的地址按元素数量array3
递增,然后取消引用结果以访问数组(衰减为指针),然后再次取消引用该指针。i
int[5]
int[5]
更新:在您现在提供的代码示例中,array3
是一个int**
指向数组指针的int*
指针int[]
(使用 动态分配new[]
)。这稍微改变了我上面所说的,但变化不大。
(*array3)[i]
本质上是*((*array3)+i)
.*array3
首先取消引用array3
以访问int*
指向数组的指针。这实际上是指向int
数组第一个元素的指针,然后[i]
应用于该指针,将其增加元素i
数int
,然后取消引用以访问实际int
元素。*array3[i]
本质上是*(*(array3+i))
. 所持有的地址按元素数array3
递增,然后取消引用结果以访问指针,然后再次取消引用该指针。i
int*
int*
推荐阅读
- regex - 从 5.27 开始的智能匹配 ~~ vs =~
- bash - ls: 无法访问 *.jpg: 没有这样的文件或目录
- python - 如何删除 `row[patient_id]` 重复且 `row[Target]==0` 的行?
- tensorflow - tensorflow对象检测API的置信度
- php - php api rewrite 不工作 XAMPP 去仪表板
- azure - Azure Kubernetes 上的 Redis 配置
- python - 如何在此代码中为图像之间的差异中心打印 (x,y) 坐标?
- java - 如何检查链表中的最后一个节点值?
- python - 使用 Python 构建预测模型。投影始终为 0
- typescript - 无法更新文档