当前位置: 首页 > 知识库问答 >
问题:

用指针访问二维数组的元素

司信厚
2023-03-14

它建议使用以下机制访问2D数组ARR[5][5]的第I行的第J元素:

*(*(ARR+I)+J)

根据我对指针的粗略了解,我知道数组的名称产生第0行的第0元素的地址,数组的任何整数增量都将产生下一行的基地址。我想在这个节骨眼之前一切都很好。

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

下面不应该是访问第I行的第J元素的代码吗?

*((ARR+I)+J)

在前面提到的情况下,增加arr i次将导致代码片段(arr+i)指向第i行的基地址,然后添加j将导致第i行的j元素的地址,然后间接运算符(*)将产生特定地址所包含的元素,不是吗?

我的推理令人满意吗?

共有1个答案

广亮
2023-03-14

根据我对指针的粗略了解,我知道数组的名称产生第0行第0个元素的地址,而数组的任何整数增量都将产生下一行的基地址。我想在这个节骨眼之前一切都很好。

不完全是你想的那样。

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

T arr[M][N];
*(*(arr+i)+j)
*(*(arr+i)+j)
 类似资料:
  • 主要内容:指针数组和二维数组指针的区别二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放

  • 本文向大家介绍举例理解C语言二维数组的指针指向问题,包括了举例理解C语言二维数组的指针指向问题的使用技巧和注意事项,需要的朋友参考一下    之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多。所以当我尝试用二级指针去访问二维数组时,就经常会出错。下面就是刚开始写的一个错误的程序: 开始的时候我是这样分析的:本来数组和指针就差不多,一维数组和一维指针对应,那么

  • 考虑以下代码: 或等同地: 是指向数组中具有2个元素的第一个元素的指针,因此访问数组的末尾,根据7.6.6 [expr.add],这是UB: 将具有整数类型的表达式 J 添加到指针类型的表达式 P 中或从中减去该表达式 J 时,结果的类型为 P。 如果 P 的计算结果为空指针值,J 的计算结果为 0,则结果为空指针值。 否则,如果 P 指向具有 个元素的数组对象 的元素 x,则表达式 P J 和

  • 7. 指向数组的指针与多维数组 指针可以指向复合类型,上一节讲了指向指针的指针,这一节学习指向数组的指针。以下定义一个指向数组的指针,该数组有10个int元素: int (*a)[10]; 和上一节指针数组的定义int *a[10];相比,仅仅多了一个()括号。如何记住和区分这两种定义呢?我们可以认为[]比*有更高的优先级,如果a先和*结合则表示a是一个指针,如果a先和[]结合则表示a是一个数组。

  • 如果一个数组中的所有元素保存的都是 指针,那么我们就称它为 指针数组。指针数组的定义形式一般为: dataType *arrayName[length]; 的优先级高于 ,该定义形式应该理解为: dataType *(arrayName[length]); 括号里面说明 是一个数组,包含了 个元素,括号外面说明每个元素的类型为 。 除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的

  • 本文向大家介绍C++中指针指向二维数组实例详解,包括了C++中指针指向二维数组实例详解的使用技巧和注意事项,需要的朋友参考一下 C++中指针指向二维数组实例详解 一维指针通常用指针表示,其指向的地址是数组第一元素所在的内存地址,如下 那么ary[4]相当于int(*aryp),以下理解如此,但参数传递需要知道实参所在 的一维个数,所以传递的时候应该传递多一个参数,子数组的引用可以理解 为(*p),