我正在学习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;
如果有一个更好的例子来说明它应该如何以及为什么会这样的话会很好。
答案 0 :(得分:3)
我不知道为什么我们需要使用2个解除引用的星号而不只是写
(*arr+i) = value;
由于arr
是指向int
指针的指针,*arr+1
是指向int
的指针。您需要一个双指针,以便您可以在函数调用中更改变量的值。
一般规则是,如果您需要在函数内更改sometype
类型的变量,则需要将sometype*
传递给函数,并使用其他星号进行分配。否则,对函数内部参数所做的更改将保留在函数的本地。在这种情况下,sometype
本身就是一个指针(即int*
),因此要在allocateArray
内修改它,您需要传递int**
。
注意:在C中你不需要转换malloc
,所以第二行代码可以像这样重写:
*arr = malloc(size * sizeof(int));