You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组按引用传参验证时,为何打印的指针地址不一致?

问题原因解析

首先纠正一个关键误区: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:30:21