数组按引用传参验证时,为何打印的指针地址不一致?
问题原因解析
首先纠正一个关键误区:C语言里不存在“数组按引用传递”的说法,所有函数传参本质都是值传递。你看到数组能被函数修改,是因为数组作为参数时会自动退化为指向首元素的指针——传递的是这个指针的副本,但副本指向的还是原数组的内存区域。
你的代码里打印地址不同的核心原因:
&foo取的是原数组变量本身的地址(整个数组的起始地址)&array取的是函数参数里那个指针变量的地址,这个指针是函数栈帧里生成的局部变量,和原数组的地址自然不一样
如果要验证传参后指向同一块内存,应该打印数组首元素的地址,或者直接打印指针本身(数组名退化为指针后,其值就是首元素地址)。修改后的验证代码如下:
#include <stdio.h> void arrayFunction(int array[4]); int main(void){ int foo[4] = {0, 1, 2, 3}; // 打印数组首元素地址,或直接打印foo(数组名退化为指针) printf("foo首元素地址(main中):%p\n", &foo[0]); printf("foo本身的值:%p\n", foo); arrayFunction(foo); } void arrayFunction(int array[4]){ // 打印指针指向的首元素地址,或直接打印array printf("array指向的首元素地址(函数中):%p\n", &array[0]); printf("array本身的值:%p\n", array); array[0] = 22; }
运行这段代码你会发现,foo和array的值(即首元素地址)完全相同,这也解释了为什么修改array[0]会影响原数组——因为它们指向同一块内存。
额外补充:函数参数里的int array[4]和int *array是完全等价的,编译器都会把它当成指针处理,这里的[4]仅作为代码提示,不会限制传入数组的实际长度。
内容的提问来源于stack exchange,提问作者landofthegnomes
相关产品推荐
相关产品推荐

