如何使用指针访问这个二维数组的元素?

Posted

技术标签:

【中文标题】如何使用指针访问这个二维数组的元素?【英文标题】:How can I use pointers to access the elements of this two-dimensional array? 【发布时间】:2021-06-14 02:03:40 【问题描述】:

我有一个二维数组如下: 字符板[3][3] = '1', '2', '3', '4', '5', '6', '7', '8', '9' ;

我访问它的元素如下:

cout << board[0][0] << board[0][1] << board[0][2] << "\n";
cout << board[1][0] << board[1][1] << board[1][2] << "\n";
cout << board[2][0] << board[2][1] << board[2][2] << "\n";

现在我想创建一个指向这个数组的指针并访问它的元素。所以这就是我想出的:char (*ptr)[3] = board 这不起作用。

如何使用指针访问元素?

【问题讨论】:

“不起作用”是什么意思?我觉得很好:godbolt.org/z/oco4fExjj 正如您所描述的,ptr[i][j] 将访问board[i][j](假设ij 是有效的索引,即介于02 之间)。如果您期望有所不同,则需要指定您的期望。 所以,我需要在不使用括号的情况下访问元素。例如,我仍然使用数组括号来获取元素,例如 (ptr)[0][0] for 1 和 (ptr)[0][1] for 2... @ArmeenParsa [ ] 运算符也用于从指针索引。目前尚不清楚“不使用括号”是什么意思。您可以使用转换a[b] *((a) + (b)) ptr 周围不需要大括号。由于优先顺序 (ptr)[i][j]ptr[i][j] 是等价的。 【参考方案1】:

我会尽量给出一个笼统的答案:

想象一下,如果你有一个多维整数数组:

int arr[3][3] = 2,1,2, 3,4,6, 2,1,9;

这里。有 3 行和 3 列 [3][3]。 您可能想至少在此方法中了解它们(数组、行和列的大小)。还有另一种方法可以使用,但我敢肯定,它会超出范围。

所以,

使用指针访问每个元素的方式是:

 for(int *iter = &arr[0][0]; iter != &arr[0][0] + 3 * 3; iter++)
    std::cout << * (iter) << "  " ;
  

*iter = &amp;arr[0][0] 在这里我们将其分配给第一个元素,并且条件设置为iter != &amp;arr[0][0] + 3 * 3,因为我知道大小是 3 行 3 列,所以我这样做了,你可以这样做 + rows * columns; 那会工作。

Optiplex@jetta:~/Desktop/PROGRAM/CPP$ ./b.out
2  1  2  3  4  6  2  1  9 

这是给你的输出。

同样,也会为角色做,

字符代码:

#include <iostream>
#include <string>

int main()
  
  char BOARD[3][3] = '1', '2', '3', '4', '5', '6', '7', '8', '9';

  for(char * iter = &BOARD[0][0]; iter != &BOARD[0][0] + 3 * 3; iter++)
    std::cout << * (iter) << "  " ;
  

输出:

Optiplex@jetta:~/Desktop/PROGRAM/CP$ ./b.out
1  2  3  4  5  6  7  8  9

我们使用了 iter 作为指针。并且 iter 是 iterator 的缩写(因为您正在使用它来遍历您的数组,所以可以方便地命名您的变量)。 希望对你有帮助,如果还有什么问题请告诉我。

【讨论】:

非常感谢!我很好奇我是否可以完全不使用 for 循环来获取元素。我可以吗? @ArmeenParsa 显然你可以做到,循环只是一个重复完成的自动化任务,你可以通过增加 iter 来手动完成,你看到 iter++ 了吗?在循环?。就是这样。这为你做的工作。如果您手动完成,则必须执行 iter = iter + 1;它会跳转到数组中的下一个元素,因为数组是按顺序存储的,它会跳转到下一个右边的元素。仍有疑问,欢迎提问 所以像 board[1] 会是 *(ptr + 1)。那么板[1][1]呢?对不起,这对我来说有点难...... 是的,如果 *iter = &BOARD[0][0]; *(iter + 1) = 2 *(iter + 4) = 5 *(iter + 2) = 3 (实际上可以使用的方法太多了,甚至还有双指针方法,但是您必须研究一下,我不建议直接跳到它,如果你仍然想要它,它很容易找到只是谷歌多维指针算法。

以上是关于如何使用指针访问这个二维数组的元素?的主要内容,如果未能解决你的问题,请参考以下文章

C中的二维数组和指针 - 如何访问元素?

C语言如何定义指针指向字符型二维数组

我可以使用 C++ 中的指针访问二维数组的元素吗?

C语言数组指针&数组名和数组名数组是首元素地址(两特殊情况)数组指针访问二维数组数组指针的使用。

如何让 VC++ 以二维数组的形式访问指针

如何在 C++ 中分配一个二维指针数组