首页 > 解决方案 > 使用指针访问二维数组的元素

问题描述

我正在阅读有关使用指针访问 2D 数组的各个元素的文章。

它建议使用以下机制来访问二维数组 arr[5][5]的第i行的第 j个元素:

*(*(arr+i)+j)

根据我对指针的粗略理解,我了解到数组的名称产生第 0 行的第 0 个元素的地址,并且数组的任何整数增量都将产生下一行的基地址。我想,到目前为止一切都很好。

但是,我无法理解的是以下代码段中间接 (*) 运算符的相关性:

*(arr+i)

在这种情况下,间接运算符如何相关?由于数组本身的名称会产生第 0 行的基地址,因此向其添加任何整数都需要它指向下一行的基元素。在这种情况下,以下代码段会生成第 i 行的地址

(arr+i)

并且添加 j 保证指针指向所述行的第 j个元素。

但是,在以下代码段中:

*(arr+i)

添加间接运算符不会导致它产生行的第 i元素,而不是第 i 行的基元素的地址

下面不应该是访问第 i第 j元素的代码吗?

*((arr+i)+j)

在上述情况下,将 arr i 递增将需要代码片段(arr+i)指向第 i 行的基地址然后将 j 相加将需要第 i 行的第 j 个元素的地址然后间接运算符(*) 会产生特定地址持有的元素,不是吗?

我的推理令人满意吗?

标签: cpointersmultidimensional-arrayimplicit-conversion

解决方案


根据我对指针的粗略理解,我了解到数组的名称产生第 0 行的第 0 个元素的地址,并且数组的任何整数增量都将产生下一行的基地址。我想,到目前为止一切都很好。

这不完全是你的想法。

表达式中使用的数组指示符被隐式转换(极少数例外)为指向其第一个元素的指针。

如果您有一个二维数组,例如

T arr[M][N];

(其中T是某个类型说明符)然后数组指示符arr被转换为类型为 T ( * )[N] 的指针,该指针指向数组arr[0]中类型为 的第一个元素T[N]

当然指针的值等于类型的第一个元素 arr[0][0] 的地址值T

所以让我们考虑一下表达式

*(*(arr+i)+j)

在此表达式中,数组指示符arr被转换为指向数组第一个元素的指针。那就是表达式arr产生表达式的值&arr[0]。表达式arr + i产生值&arr[i]。像*( arr + i )您一样取消引用表达式将得到一维数组arr[i],该数组又*( arr + i ) + j被转换为指向其类型的第一个元素的指针,该指针与T *表达式等效&arr[i][0]。由于添加了变量j,指针指向元素&arr[i][j]。像这样取消引用这个表达式

*(*(arr+i)+j)

这相当于&arr[i][j]您将获得元素的表达式arr[i][j]


推荐阅读