Sunny-smile 发表于 2014-8-23 09:50:10

不懂问题,求助,急

本帖最后由 风之残月 于 2014-11-9 22:42 编辑

#include <stdio.h>
int main()
{
      char a[]="I am a student.",b; //定义字符数组
      int i,j;      
      for (i=sizeof(a)-2,j=0;i>=0;i--,j++)
                *(b+j)=*(a+i);      //将a的值赋给b      
      *(b+j)='\0';                //在b数组的有效字符之后加'\0',做为字符串结束标志
      printf("string a is:%s\n",a);
      printf("string b is:%s\n",b);
      return 0;
}

不理解for (i=sizeof(a)-2,j=0;i>=0;i--,j++)这句话

メ㊣逆ご帅☆ 发表于 2014-8-23 09:50:11

本帖最后由 メ㊣逆ご帅☆ 于 2014-8-23 10:50 编辑

sizeof(a)取到a数组的长度。
单位为字节。
你可以数一数I am a student.包括空格和标点符号。一共是15个。共15个字节。然而由于char 数组你定义的时候char a[]而不是char a。所以自动分配大小。默认为15+1=16(这个+1的空间用来存放字符串结尾\0)。
所以i=sizeof(a)-2=16-2=14
若你写成char a这时候i=sizeof(a)-2=15-2=13(当然你这样写代码运行是会出问题的)
至于为什么-2
上面说到i=14。
i a m a s t u d e n t . 这些字符包括空格共15个分别对应的数组下标为
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
若不减2
则循环会多出两个下标
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16这就越界了

对了,忘记说整体语句的作用了
for (i=sizeof(a)-2,j=0;i>=0;i--,j++)
第一次循环的时候i=14,j=0
*(b+j)=*(a+i);也就是b= a;(你完全可以把上面那个改成下面这个)

在第一次循环的时候就是 b=a。用中文描述就是b数组的第一个字符赋值为a数组的最后一个字符
在第二次循环的会后就是 b=a。用中文描述就是b数组的第二个字符赋值为a数组的倒数第二个字符

以此类推就是把a数组的内容倒放到b数组,也就是倒序排放。


页: [1]
查看完整版本: 不懂问题,求助,急