我分析的答案是:CDDC。
首先要明白的是字符指针数组*s[4]它指向的是这四个字符串的首地址,
比如,S[0]存放的是第一字符串"tree"的首字符‘t’的地址,要明白的是在内存中
它们是这样存储的:
S[0]指向‘t’字符的首地址,也就是说S[0]存储的是字符‘t’的内存地址。但是不要
忘记了字符串最后面还会自动的加上字符串结束符‘\0’的。如果对于这块不明白的
还可以早C语言的书看看这一块的内容。
分析程序:
(1) i = 0; p2=S[0]; p1 = p2 + 0;
这里说明字符指针p1,p2都指向的是字符‘t’,*p1=*p2='t'。
执行while循环,循环条件满足,*p2=*p1,这里就是把*p1的值赋值给*p2,因为他们都是
指向字符‘t’所以不改变它的值。然后p1++,p2++,意味着p1、p2都指向下一个字符‘r’
仍然没有改变。依次类推下去p1、p2都指向字符‘\0’时while循环结束,接着执行
*p2=‘\0’,然而*p2本来就等于‘\0’,所以还是不变。
也就是说i = 0for循环结束一次循环,字符串“tree”没有改变。
(2) i = 1;p2=S[1]; p1 = p2 + 1;
执行while循环,第一次循环很明显的*p2 = *p1,因为*p1='l',所以*p2='l',也就是内存中‘f’就改变成了‘l’。执行p1++,p2++内存中的变化如下图:
类似的一次交换赋值,指针移动到下一位最终while循环结束。
还有一个很重要的地方需要提示一下,while循环结束但是*p2='\0'
,p2指向的值会被赋值为'\0'。p1 = p2 + i;p1指针的移动也要注意
p1到底是指向了那个字符。
C语言中,字符串中有‘\0’,则输出字符时它只会输出'\0'的前面字符。
比如:字符串“ass\0s\0”,则输出该字符串时结果为“ass”。
(3)i = 2 、3这里就不分析了,同上的分析思路。
楼下的认为 p2 在被p1 赋值的时候有问题 p2指向的是常量的字符串,不可修改。s[i]指向的是一个静态字符串, 静态字符串是不可修改的。。。
不过按照原题的意思 输出应该是 0的时候出去全字符 1的时候从第二位即下表为1的字符开始输出到最后 2、3 依次类推。
因为p1在指向s[i]后 地址+i 赋值给p2 p2的地址就是每个字符串的地址。
中间这段话是有前提的,这段程序不成立
s改为2维数组即可
我觉得 就是按顺序 s[4] 数组里的顺序 输出的.
中间操作跟 对s[4] 没影响.
楼下怎么看?
楼主的程序有很多错误 先改改吧