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在主要。