首页 > 解决方案 > 括号对数组指针有什么影响?

问题描述

在编写程序时,我发现

(*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 可以是任意数字

第一个案例的图片:

图片

标签: c++

解决方案


(*array3)[i]中,*解引用运算符首先应用于array3,然后将[]下标运算符应用于结果。

*array3[i]中,这被视为*(array3[i])因为下标运算符比解引用运算[]符具有更高的优先级。*因此,[]首先将下标运算符应用于array3,然后将*运算符应用于结果。

现在,这些有什么不同?好吧,首先你必须明白一个语句P[N],其中P是指向某种类型的指针T,实际上与 相同*(P+N),即指针持有的地址增加元素NT(即地址增加sizeof(T) * N字节数) ,然后取消引用生成的地址。

假设array3是一个指向int[]数组的指针(因为您实际上没有显示 的​​声明array3),即:

int array[5] = {...};
int (*array3)[5] = &array;

然后:

  • (*array3)[i]本质上是*((*array3)+i). *array3首先取消引用array3以访问int[]数组本身。引用数组本身将衰减为指向数组第一个元素的指针。所以现在我们有一个int*指向int数组第一个元素的指针,然后[i]应用于该指针,将其增加元素iint,然后取消引用以访问实际int元素。

  • *array3[i]本质上是*(*(array3+i)). 所持有的地址按元素数量array3递增,然后取消引用结果以访问数组(衰减为指针),然后再次取消引用该指针。iint[5]int[5]

更新:在您现在提供的代码示例中,array3是一个int**指向数组指针的int*指针int[](使用 动态分配new[])。这稍微改变了我上面所说的,但变化不大。

  • (*array3)[i]本质上是*((*array3)+i). *array3首先取消引用array3以访问int*指向数组的指针。这实际上是指向int数组第一个元素的指针,然后[i]应用于该指针,将其增加元素iint,然后取消引用以访问实际int元素。

  • *array3[i]本质上是*(*(array3+i)). 所持有的地址按元素数array3递增,然后取消引用结果以访问指针,然后再次取消引用该指针。iint*int*


推荐阅读