我对自己的指针和引用感到困惑。我想在主函数中创建一个指针并将其设置为null。我想将该指针传递给另一个函数,该函数在堆上创建一个数组,填充该数组,然后返回创建的数组的大小。
我试图找到另一篇有关该主题的文章,但未能从该函数中找到分配内存的文章。下面的示例代码说明了这一概念,但我并未编写程序来完成任何特定任务。
int fillarray(/* pointer to an array */){
// malloc the array to size n
// fill array with n elements
return n;
}
int main(){
int* array = NULL;
int size = fillarray(/* pass the pointer by reference */);
for(int i = 0; i < size; i++) printf("%d\n", array[i]);
free(array);
return 0;
}
更新:
谢谢大家的评论。我学到了很多有关解决此问题的指针的知识。下面的代码完成了我所需要的。谢谢@Lundin。您的回答使我找到了实际的解决方案。谢谢@ssd。您的视觉效果使我对代码中的内容有了一些直觉。
int fillarray(int** array){
*array = (int*)malloc(2 * sizeof(int));
(*array)[0] = 0;
(*array)[1] = 1;
return 2;
}
int main(){
int* array = NULL;
int size = fillarray(&array);
for(int i = 0; i < size; i++) printf("%d\t", array[i]);
return 0;
}
严格来说,C中没有“引用”,所有内容均按值传递。尽管术语“通过引用传递”与语言无关,并且实际上仅表示将地址传递给数据。 (C ++有一种称为引用的语言概念,但实际上只是美化了只读指针。)
因此,要实现所需的功能,必须传递指针本身的地址。这样,函数可以访问指针并将其设置为指向新地址。因此,将函数声明为int fillarray (int**)
,将函数声明为fillarray(&array)
。需要将malloc的结果分配给指针指向指针的位置-它指向main()中声明的原始指针的地址。
至于分配可变大小,您必须为此在函数中添加一个附加的纯整数参数。
我确实同意并同意Lundin's的答案,但为了更加概念化,我将在下面添加图形,因为我过去在理解指针时同样感到痛苦。
(int *a
)下面的第一个整数指针在内存地址4c4b40
处,并且其值设置为零(这意味着该指针a
设置为null
)。
第二个整数指针(int *b
)位于存储器地址4c4b48
,其值设置为4c4b58
(这意味着该指针指向具有整数长度的存储器地址4c4b58
)。如果该地址对应于变量int x = 16
(十六进制10等于16),则取消引用指针b会得到16的整数值(*b = 16
,因为x = 16
)。
第三个内存是另一个字符串指针,它指向下方的某个内存地址。
返回答案:
如果要更改第一个指针(a
)的地址以指向变量x
,则您正在调用的函数需要接收指针的地址(不是指针本身);即&a
,而不是a
,它对应于4c4b40
。调用的函数将把地址4c4b40
作为存储器地址接收,并将其值从000000
更改为4c4b58
。当然,函数修饰将包含一个int **
。例如,如果整数指针是int *
,则指向该指针的指针将是int **
。