取消引用双指针

And*_*anu 4 c

我有代码片段,我无法理解它是如何工作的,因为有一行进行了双重取消引用。代码如下所示:

void afunction(int**x){
    *x = malloc(2 * sizeof(int));
    **x = 12;
    *(*x + 1) = 13;
}

int main(){
    int *v = 10;
    afunction(&v);

    printf("%d %d\n", v[0], v[1]);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我知道指向指针的指针的第一个元素的值是 12,但之后的行我似乎无法理解。第一个指针中的第二个元素的值是否为 13?

Jac*_*ack 7

如果您使用临时变量,代码很容易理解,例如:

void afunction(int**x)
{
    int* t = *x;

    t = malloc(2 * sizeof(int));
    *t = 12;
    *(t+1) = 13;
}
Run Code Online (Sandbox Code Playgroud)

所以:

  • x 是一个指向一个指针的指针 int
  • *x产生一个int*(指向int)
  • **x =就像*(*x) =这样你首先获得指针int然后通过取消引用你可以在地址处设置值

最后一部分*(*x+1) =可以分解:

int* pointerToIntArray = *x;
int* secondElementInArray = pointerToIntArray + 1;
*secondElementInArray = 13;
Run Code Online (Sandbox Code Playgroud)

这里使用指向指针的指针的目的是可以将地址传递int*给函数,让函数分配内存并填充数据。可以通过返回一个 来达到同样的目的int*,例如:

int* afunction() {
  int* x = malloc(sizeof(int)*2);
  *x = 12;
  *(x+1) = 13;
  return x;
}

int main() {
  int* v = afunction();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)