《C专家编程》chapter 9中第一个习题

#include <stdio.h>
#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指针向后挪动了一位,这个操作是被先执行的,所以才导致了前面提到让我困惑的输出!










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值