【问题标题】:Pointer to a pointer dereference指向指针解引用的指针
【发布时间】:2014-09-14 01:12:41
【问题描述】:

我正在学习 C 语言,实际上在一些可能很明显的问题上停了下来。

void allocateArray(int **arr, int size, int value) {
    *arr = (int*)malloc(size * sizeof(int));
    if(*arr != NULL) {
        for(int i=0; i<size; i++) {
            *(*arr+i) = value;
        }
    }
}

来电者:

int *vector = NULL;
allocateArray(&vector,5,45);

这是来自理解和使用 C 指针的代码。问题是我无法想象这条线是如何工作的:

*(*arr+i) = value;

更准确地说,我不知道为什么我们需要使用 2 个解引用星而不是只写 (*arr+i) = value;

如果能获得一些更好的例子来说明它应该如何以及为什么应该这样,那就太好了。

【问题讨论】:

  • 什么是int **ar?两个星号加在一起是什么意思?
  • 如果你写 int* p = malloc (size * sizeof (int)); 会容易得多*arr = p;从那时起使用 p 代替 *arr。
  • @PM77-1 这是一个指向 int 的指针。你是对的 gnasher729。当我理解它时,它现在很容易:)

标签: c pointers dereference


【解决方案1】:

我不知道为什么我们需要使用 2 个解引用星而不是只写 (*arr+i) = value;

因为arr 是指向int 的指针,所以*arr+1 是指向int 的指针。您需要一个双指针,以便您可以从函数调用内部更改变量的值。

一般规则是,如果您需要在函数内部更改sometype 类型的变量,则需要将sometype* 传递给函数,并在内部使用额外的星号进行赋值。否则,您对函数内部参数所做的更改将保持在函数的本地。在这种情况下,sometype 本身就是一个指针(即int*),因此要在allocateArray 中修改它,您需要传递int**。

注意:在C语言中你不需要转换malloc,所以第二行代码可以这样重写:

*arr = malloc(size * sizeof(int));

【讨论】:

  • 其实我刚发布问题就知道了,但是谢谢你的回答。我认为向自己解释自己的问题很好,因为您可以更轻松地解决它:)
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2011-08-04
  • 2013-01-04
  • 2022-01-07
  • 2010-12-26
  • 2022-11-10
相关资源
最近更新 更多