#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
char ga[5];
void func1(char ca[]);
void func2(char *pa);
int main(int argc, char *argv[])
{
int i = 0;
for (i = 0; i < 5; i++)
{
ga[i] = 'A' + i;
}
func1(ga);
printf("%s, %s, %s\n", &ga, &(ga[0]), &(ga[1]));
func2(ga);
return 0;
}
void func1(char ca[])
{
printf("%s, %s, %s\n", &ca, &(ca[0]), &(ca[1]));
}
void func2(char *pa)
{
printf("%s, %s, %s, %s\n", &pa, &(pa[0]), &(pa[1]), pa++);
}
下面是我在dev C++中的运行结果:
hp@, ABCDE,BCDE
ABCDE,ABCDE,BCDE
ip@,BCDE,CDE,ABCDE
注意:
a. 表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针
b. 下标总是与指针的偏移量相同
c. 在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针
下面对输出结果做一下解释:
1. func1()中的输出:第一个&ca -->> hp@,因为ca是一个指针变量,以这个指针变量的地址为起始的空间并不是一个 字符数组,所以它的输出“hp@”我视为乱码(不合法,个人理解)
第二个 &(ca[0])-->>ABCDE,很容易理解,对数组中第一个元素取地址实际上就是数组的首地址 (实际上, 在函数内部对数组参数的任何引用都将产生一个对指针的引用。所以,这里编译器 还是将其作为指针加上偏移量处理)。
。。。
2. main中的输出:
。。。
3. func2()中的输出:
这个是我最想记录和说明的地方!
第一个&pa -->>ip@,1中已经说明
第二个&(ca[0]) -->> BCDE,第三个&(pa[1]) -->> CDE,第四个pa++ -->>ABCDE,
这是一开始最让我困惑的地方,为什么第二个输出是BCDE,而不是ABCDE,同样的第三个是CDE,而不是BCDE。。。几经周折之后,才发现是printf()函数在捣乱。printf函数的执行过程是:
a. 先计算引号外的表达式的值,其计算的顺序从右往左
b. 按照引号内的格式输出,从左往右
到这里就明白了,实际上由于pa++将我们的pa指针向后挪动了一位,这个操作是被先执行的,所以才导致了前面提到让我困惑的输出!