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

数组标识符解析差异:本地与函数参数数组的地址疑问

本地数组与函数参数数组的地址表现差异原因

示例代码

#include <stdio.h>

void test(char[]);

int main(void) {
  char array[] = {0};
  printf("[Control]  (&array[0]: %p)\n", &array[0]);
  printf("[Local]    (array: %p) (&array: %p)\n", array, &array);
  test(array);
}

void test(char array[]) {
  printf("[Function] (array: %p) (&array: %p)\n", array, &array);
}

编译与运行命令

gcc -o test test.c && ./test

运行输出

[Control]  (&array[0]: 0x5b49a21cf4e6)
[Local]    (array: 0x5b49a21cf4e6) (&array: 0x5b49a21cf4e6)
[Function] (array: 0x5b49a21cf4e6) (&array: 0x63f81d8e4950)

差异原因解析

1. 本地数组的地址表现

在main函数里的char array[] = {0}是真正的数组变量:

  • 直接使用array时,C语言会自动将其转换为指向数组第一个元素的指针(等价于&array[0]),因此打印的地址和&array[0]完全一致。
  • &array是取整个数组的地址,数组的起始地址与它第一个元素的地址数值相同(数组从第一个元素开始连续存放)。虽然&array的类型是char (*)[1](指向长度为1的char数组的指针),而array转换后的类型是char*,但printf的%p仅输出地址的数值,所以两者显示结果一致。

2. 函数参数的地址表现

C语言中,函数参数里的数组声明是语法糖,编译器会自动将其转换为指针类型。也就是说void test(char array[])和void test(char *array)完全等价:

  • 这里的array是一个指针变量,它的值就是调用时传入的数组首元素地址(即main里array转换后的指针值),所以打印的地址和之前一致。
  • &array是取这个指针变量本身的地址,该指针变量存储在函数test的栈帧中,和原数组的存储位置完全无关,因此输出的地址与原数组地址截然不同。

内容的提问来源于stack exchange,提问作者Sir Galahad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:57:17