【问题标题】:Double pointer addresses双指针地址
【发布时间】:2017-12-05 21:28:33
【问题描述】:

我创建并分配了一个这样的双指针:

 int **a;
 a = (int**)malloc(10 * sizeof(int *));
 for (int i = 0; i < 10; i++)
     *(a+i) = (int *)malloc(10 * sizeof(int));

然后我像这样初始化它:

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        **a = 1;
         (*a)++;
    }
    a++;
 }

我的问题和疑问是如何保存双指针的地址?此时我丢失了它们,不能再使用它们了。

【问题讨论】:

  • 原地址在a-10
  • 别惹a。只需使用a[i][j] = ... 分配给它;
  • 在 C 语言中,不要将调用结果转换为 malloc()realloc()calloc() - 这是不必要的,并且可能会隐藏缺少原型的严重错误。

标签: c pointers double-pointer


【解决方案1】:

当数组下标可以使用时,不要使用显式指针算术和取消引用:

 int rows = 10, cols = 10
 int **a;
 // don't cast the return value of malloc
 a = malloc(rows * sizeof(*a));
 for (int i = 0; i < rows; i++)
     a[i] = malloc(cols * sizeof(**a));

...

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        a[i][j] = 1;
    }
 }

【讨论】:

  • 当答案是关于代码实践但没有良好的代码实践(如尽可能初始化值或使用好的类型size_t)时,这总是让我感到难过,甚至不直接使用 sizeof 分配类型但间接地使用指针的解引用类型,幻数也是。
  • 感谢您的回复和帮助,但我已经知道了。我知道您可以轻松地使用 a[i][j] 并在程序的其余部分使用 a[i][j] 并解决问题。但我不想让问题更容易解决对我来说是这样的。老师已经告诉我了,但我想加深对指针的了解。
  • @OvidiuFirescu 除非您有非常具体的与性能相关的理由,否则您应该始终支持代码清晰而不是花哨的技巧。也就是说,等价于a[i] 的是*(a + i),并且通过扩展a[i][j]*(*(a + i) + j) 相同。
  • @dbush 我知道你到现在为止所说的一切,你是完全正确的,但我尝试了 1 小时,通过在我的代码中测试不同的东西来找出这个“花哨的把戏”的答案。我写的代码只是指出我的问题的一个例子。
  • @OvidiuFirescu 您的代码的问题是您在不需要时更改了a。上述任何一种索引方法都可以使用。
【解决方案2】:

从函数返回a,将其保存为类成员,它就像任何其他变量一样。如果你想保存数组的内容,那么就这样做(但这不是我可以称之为保存双指针的方式——通常的描述是“指针到指针”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多