【问题标题】:Access data of double pointers array访问双指针数组的数据
【发布时间】:2018-07-30 15:36:41
【问题描述】:

我正在编写一个使用双指针静态数组的数据结构。第一个数组的每个单元都指向一个动态指针数组,其中每个指针都可以指向一种数据(假设int)。我想访问主指针数组中的数据

这是我想要实现的示例我故意省略了对malloc 正确分配的检查为了让代码更清晰:

#include <stdio.h>  
#include<stdlib.h>

typedef int *pointer;

int main() {
    int **mainArray[10] = {NULL};
    int **p = NULL;
    int n = 5;
    p = malloc(15 * sizeof(pointer));

    //the following instruction makes no sense since the pointer
    //is not initialized, as suggested in the asnwers. 
    *p[3] = n;
    mainArray[4] = p;
    return 0;
}

我想知道如何从mainArray 访问int 值,例如打印它的值。

想法是使用p 分配动态内存,然后跟踪使用mainArray 创建的内存。

我知道我可以使用double 指针,例如**mainArray[n],但我找不到如何指定第二个动态数组的索引的方法。使用**mainArray[n],我将访问mainArray[n],然后是p[0] 指向的int(如果我没记错的话)。

我如何指定,例如,在mainArray[4] 中访问p[3](也许是为了用printf 打印它)?

PS:我知道我正在做的事情可以通过矩阵轻松实现,但由于一些外部限制,我需要这种方法。

【问题讨论】:

  • 这是不正确的。 ** 已经做了两次取消引用,所以双指针变成了一个值。你不能再索引了。此外,您的分配是错误的,因为您没有将任何内容分配给 mainArray 等。如果您只是将编写的代码放入编译器,它将首先出现错误。还有一种说法是,如果您需要三星级编程(请参阅 mainArray),那么代码很可能有一些非常错误的地方。
  • @SamiKuhmonen 为什么我没有为 mainArray 分配任何东西?这个想法是让mainArray的单元格中的数组指向p指向的相同地址,即分配的动态内存的地址。我错了吗?
  • 对不起,你在 mainArray 中有 10 个指针,你可以在其中分配东西,但是 **p[3] 例如不起作用,因为它不是三重指针,你也没有分配任何东西到它的第二层。这很复杂,不清楚为什么需要这种复杂性。
  • @SamiKuhmonen 我编辑了它,是现在吗?顺便说一句,我需要这种方式,因为我有第一个静态 mainArray,其中(在我的真实项目中)每个单元格都指向一个 hashmap
  • 您仍然可以访问内容,而无需使用 *p[3] 进行分配。你只分配了 15 个指针,它们指向它们碰巧指向的任何地方,然后你试图访问第一个指向的内存。不允许

标签: c pointers dynamic malloc


【解决方案1】:

我想知道如何从mainArray获取int值, 例如打印他的值。

这个想法是使用p 分配动态内存,然后跟踪 用mainArray创建的内存。

您正确地完成了这部分,在p 中产生了一个指向一个对象的指针,该对象可以被合理地描述为15 个int * 的动态数组。 p 的值是分配给mainArray 元素的正确类型,但请注意p 的任何元素都未初始化。他们没有指向任何东西。您需要为它们分配值,以便它们指向某个地方,然后您才能访问它们指向的位置。

我知道我可以使用双指针,例如**mainArray[n], 但我找不到如何指定第二个动态的索引的方法 大批。使用**mainArray[n] 我将访问mainArray[n] 然后 p[0] 指向的 int (如果我没记错的话)。

我如何指定(例如)在mainArray[4] 中访问p[3] (也许是为了用 printf 打印)?

mainArray[4] 是一个int **。如果我们将它分配给您的变量p,那么我们可以通过普通索引运算符访问索引 3 处的元素,如您所示。这同样适用于表达式mainArray[4]:表达式mainArray[4][3] 为您提供所需的值(int *)。

通常,在将运算符链接在一起时,您需要注意运算符的关联性和优先级,但这种特殊情况很简单。你可以写和(mainArray[4])[3]一样的东西,但我不明白你为什么要这么做。

也许您正在努力解决的问题是,在mainArray[4][3] 中,两个索引运算符是分开且独立的。您不需要将mainArray 声明为二维数组即可使用该形式;您只需要将其声明为指针或数组的指针或数组(二维数组只是数组的数组)。第一个索引运算符适用于mainArray 本身;第二个适用于第一个的结果。这与1 + 2 + 3 的求值并无太大不同,因为第一个+ 操作的结果是第二个操作数。

【讨论】:

  • 知道了!我明白问题出在哪里,你的解释很清楚,很中肯。无论如何,我问这个是因为我正在创建一个哈希图数组。这是我真正问题的一个更简单的案例
【解决方案2】:

首先 - 不要 typedef 指针,因为使用它的代码很难阅读并且容易出错。

您的第一个 malloc 只为指向 ints 的指针分配内存

要存储实际对象,您需要为此对象分配内存。

p[3] = malloc(sizeof(**p));
*p[3] = n;

你也可以用指向现有对象的指针来赋值;

int x;
p[3] = &x;
*p[3] = n;

你也可以为多个对象分配内存

p[3] = malloc(100 * sizeof(**p));
*(p[3] + 10) = n;
p[3][9] = n;

您可以通过指向指针的指针数组来访问它,但我们正陷入三星级困境。三星级还是不三星级。 IMO 当您到达需要 *** 指针(或 ** 数组)的地步时,您需要认真重新考虑您的算法。

http://wiki.c2.com/?ThreeStarProgrammer

【讨论】:

  • 这是正确且有用的信息,但与实际提出的问题无关。
  • 赞成,它帮助我理解 *p[3]=n 中的错误,在我的代码中没有任何意义,因为我从未为该指针分配任何东西。
  • 无论如何,我正在创建一个哈希图数组,这是一件疯狂的事情吗?
  • 这是您需要自己回答的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多