再论数组
程序代码:
#include<stdio.h> char ga[] = "abcd"; void f1(char ca[]) { printf("in f1(char ca[]):\n"); printf("&ca = %x, &(ca[0]) = %x, &(ca[1]) = %x\n\n", &ca, &(ca[0]), &(ca[1])); } void f2(char *pa) { printf("in f2(char *pa):\n"); printf("&pa = %x, &(pa[0]) = %x, &(pa[1]) = %x, ++pa = %x\n", &pa, &(pa[0]), &(pa[1]), ++pa); printf("pa[0] = %c\n\n", pa[0]); } int main(void) { printf("in main():\n"); printf("&ga = %x, &(ga[0]) = %x, &(ga[1]) = %x\n", &ga, &(ga[0]), &(ga[1])); f1(ga); f2(ga); return 0; }
/* 输出在vs2010上 */
/*
in main():
&ga = cb3018, &(ga[0]) = cb3018, &(ga[1]) = cb3019
in f1(char ca[]):
&ca = 2cfc70, &(ca[0]) = cb3018, &(ca[1]) = cb3019
in f2(char *pa):
&pa = 2cfc70, &(pa[0]) = cb3019, &(pa[1]) = cb301a, ++pa = cb3019
pa[0] = b
请按任意键继续. . .
*/
书上有这么几句话:
规则1:“表达式中的数组名”就是指针
规则2:C语言把数组下表作为指针的偏移量
“作为函数参数的数组名” 等同于指针
那么为什么 &pa[0] 会等于 &ga[1], ++pa 会等于 &(pa[0]) ? 刚才在GCC上面测试过,也是这样,只有用 pa[-1] 才会得到 'a'
而当函数形参为数组时,才会与实际相符合,但在 ANSI C标准6.7.1节中有这样一种解释 “在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针”,既然是这样,那么 &pa[0] 和 &ca[0] 为什么会相差一个步长?