我正在尝试操作数组prarr[3][3]
通过使用指针ptr_ptr_prarr
到数组 ptr_prarr[3][3]
包含指向 prarr[3][3]
的指针。
我想以某种方式指出ptr_ptr_prarr
至ptr_prarr
并访问prarr[i][j]
中的数据通过使用类似ptr_ptr_prarr[i][j]
的东西。
void main()
{
int prarr[3][3];
int count = 1;
for (int i = 0; i <= 2; i++)
for (int j = 0; j <= 2; j++)
prarr[i][j] = count++;
//printArray(prarr);
int *ptr_prarr[3][3];
for (int i = 0; i <= 2; i++)
for (int j = 0; j <= 2; j++)
ptr_prarr[i][j] = &prarr[i][j];
int n = 1, x = n, y = n;
printf("\nArray Coords:(%d,%d)\nMemory location:%p\nValue:%d",
x, y, ptr_prarr[x][y], *ptr_prarr[x][y]);
int **ptr_ptr_prarr= *ptr_prarr;
printf("\n");
for (int i = 0; i <= 8; i+=3)/* <<--------------------------------- */
{
for (int j = 0; j <= 2; j= (j+1))
printf("%d", (ptr_ptr_prarr[i][j]));
printf("\n");
}
Sleep(20000);
}
我想我已经接近了,但由于某种原因 ptr_ptr_prarr
需要包含“<<------------------------------------------------”的行:以不同的方式按顺序迭代复制原始数据。
不知何故,我访问了一些错误的内容,任何帮助将不胜感激!
最佳答案
我认为问题出在这一行......
int **ptr_ptr_prarr= *ptr_prarr;
这将创建一个指向 prarr[0][0] 地址的双指针。我认为你想做的是......
int **ptr_ptr_prarr= ptr_prarr;
这将创建一个指向 ptr_prarr 指针的指针,然后可以取消引用该指针以获取原始数组。
这样做的话,如果你想使用ptr_ptr_prarr修改prarr,你可以这样做
**ptr_ptr_prarr = 10
这将修改原始数组,以便 prarr[0][0] 现在包含值 10。
**(ptr_ptr_prarr + 1) = 10
这将修改原始数组,以便 prarr[0][1] 现在包含值 10。
总的来说,这是对指针的糟糕使用。这似乎不是特别有用,我也不认为它有助于更好地理解指针。如果您尝试在实际程序中使用这段代码(而不仅仅是作为示例),我建议您找到一种不同的方法来实现它。
关于c - 从指针到指向原始数组的指针数组操作原始数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45765127/