c - 使用指针访问二维数组的元素
问题描述
我正在阅读有关使用指针访问 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 个元素的地址,然后是间接运算符(*) 会产生特定地址持有的元素,不是吗?
我的推理令人满意吗?
解决方案
根据我对指针的粗略理解,我了解到数组的名称产生第 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]
。
推荐阅读
- jekyll - GitHub 页面无法识别我的 Liquid 标签
- crystal-reports - 在 Crystal Reports 中显示 4 页子报表
- regex - 字母、数字和-_表单域验证的正则表达式
- php - 如何修复我的 ajax 解析器,使其显示我想要显示的所有节点
- python - 将文本文件中的不一致数据合并到一个 Excel 电子表格中
- mongodb - 来自heroku java应用程序的MongoDB“未发送SNI名称”错误
- vector - 有没有办法获得对向量元素的可变引用和对其他元素的不可变引用?
- python - 在 Python 3 中检测到关键字后提取某个引号
- python - 我在哪里可以找到 numpy.where() 源代码?
- javascript - 找不到 API 调用模块的 XMLHttpRequest 错误