取消引用双指针

时间:2017-02-08 16:13:21

标签: 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;
}

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

1 个答案:

答案 0 :(得分:3)

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

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

    t = malloc(2 * sizeof(int));
    *t = 12;
    *(t+1) = 13;
}

这样:

  • x是指向int
  • 指针的指针
  • *x会产生int*(指向int
  • 的指针
  • **x =*(*x) =类似,因此您首先获取指向int的指针,然后通过取消引用您可以在地址处设置值

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

int* pointerToIntArray = *x;
int* secondElementInArray = pointerToIntArray + 1;
*secondElementInArray = 13;

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

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

int main() {
  int* v = afunction();
  return 0;
}