数组标识符解析差异:本地与函数参数数组的地址疑问
本地数组与函数参数数组的地址表现差异原因
示例代码
#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
相关产品推荐
相关产品推荐

