【问题标题】:Manipulating original array from pointer to array of pointers to original array从指向原始数组的指针数组操作原始数组
【发布时间】:2017-08-18 21:13:22
【问题描述】:

我正在尝试通过使用指向包含指向prarr[3][3] 的指针的数组ptr_prarr[3][3] 的指针ptr_ptr_prarr 来操作数组prarr[3][3]

我想以某种方式将ptr_ptr_prarr 指向ptr_prarr 并使用ptr_ptr_prarr[i][j] 之类的东西访问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 需要包含“

不知何故,我访问了一些错误,任何帮助将不胜感激!

【问题讨论】:

  • 指针有点复杂,但你把它弄得更糟了。为什么不简单呢?
  • 提示;使用不同的大小可以更好地说明有关 2D 数组的问题,例如 int prarr[2][3];
  • 有点难以理解为什么要使用这个指针数组。如果它不仅仅是为了试验指针,你能描述一下你真正想要实现的目标吗?无论如何,for (int i = 0; i &lt;= 8; i+=3)ptr_ptr_prarr[i][j]),其中您的竞争程序不包含任何大于 [3][3] 的数组是可疑的。
  • 这实际上只是为了实验。这只是为了充实我对指针和数组的理解。

标签: c arrays pointers syntax


【解决方案1】:

我认为问题出在这条线...

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。

总的来说,这是对指针的不良使用。这似乎不是特别有用,我认为它也无助于更好地理解指针。如果您尝试在实际程序中使用这段代码(而不仅仅是作为示例),我建议您找到一种不同的方法。

【讨论】:

  • 谢谢。几天前,我在做其他事情时遇到了这个问题,但在那个项目中,我只是找到了一种不同的方法。我今天回到这个问题,因为我认为它可以加深我对指针的理解。您提供的解决方案实际上是我尝试的第一件事,但我认为它不起作用,因为我的编译器吐出错误..."警告 C4047: 'initializing': 'int *'从 'int *()[3]' 间接间接“......我认为我的理解一定有缺陷。它虽然有效。我应该忽略我的编译器。谢谢!
  • 嗯,编译器是对的。它会起作用(几乎任何东西都可以在 C 中起作用),如果您不确切知道自己在做什么,它可能会产生一些奇怪的行为。老实说,ptr_prarr 应该是一个包含地址的数组,或者是一个指向该数组的指针(您可以根据需要递增)。由于您正在尝试使用指针进行练习,因此我建议您使用第二个选项。这样你实际上就有了一些双指针的练习。
【解决方案2】:

没有必要在数组上使用地址运算符,因为数组会衰减为赋值运算符右侧的隐式指针。 所以

int **ptr_ptr_prarr= ptr_prarr;

Pointer to Array of Pointers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2019-11-07
    • 2017-07-05
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    相关资源
    最近更新 更多