C 解除对双指针的引用

C 解除对双指针的引用,c,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; } 我知道指针

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

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?

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

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;
}

那么您的输出告诉您什么呢?此代码导致函数中出现运行时错误,
x
的类型为
int**
。因此,
*x
具有类型
int*
,而
*x+1
是指针算术:结果是指向一个元素的指针,该元素超过
**x
*(*x+1)
指定该位置的
int
;根据定义,它完全等同于
(*x)[1]
。因此,是的,函数的最后一行将动态分配块中的第二个
int
设置为13。@m_callens,它没有设置(除了v没有空闲)。有一个编译时错误,即E是main中v的错误初始化。@m_调用得很好;我明白了:这是由于返回1在主要。