这个
char s[]="TvNnFs",*p;
其中s 是一个字符数组,p 是字符指针,如下所示
s[0] s[1] s[2] s[3] s[4] s[5] s[6]
------------------------------------------
| T | v | N | n | F | s | \0 |
------------------------------------------
s 0x100 0x101 0x102 0x103 0x104 0x105 0x106.. (assume 0x100 is base address of s)
接下来,for 循环
for(p=&s[5];p>=s;p--)
--*p;
这里p=&s[5]指针p指向s[5]的地址,即0x105。接下来是p>=s,即0x105 >= 0x100,这是真的,然后--*p首先执行*p,这意味着0x105内存位置的值s和递减将使s[5]成为r .
现在 char 数组 s 看起来像
s[0] s[1] s[2] s[3] s[4] s[5] s[6]
---------------------------------------------
| T | v | N | n | F | r(new)| \0 |
---------------------------------------------
s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..
注意:您可能想知道--*p 是如何影响s 的?这是因为p 指向或持有s 的地址,即对*p 所做的任何更改都会间接影响s。
在p-- 发生之后,即p 现在指向比以前更早的一个位置,即0x104。在p 到达s 即0x100 >= 0x100 之前,将进行相同的操作。最后 char 数组 s 看起来像
s[0] s[1] s[2] s[3] s[4] s[5] s[6]
-------------------------------------------
| S | u | M | m | E | r | \0 |
-------------------------------------------
s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..
因此它打印SuMmEr。
案例2:
char s[]="TvNnFs",*p;
for(p=&s[5]; p>=s; p--)
((--*p)<'a')?(*p+=('a'-'A')):(*p);
puts(s);
这里
s[0] s[1] s[2] s[3] s[4] s[5] s[6]
------------------------------------------
| T | v | N | n | F | s | \0 |
------------------------------------------
s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..
|
p points here
对于0x105 >= 0x100:这个
((--*p)<'a')?(*p+=('a'-'A')):(*p);
是三元运算符,即首先执行((--*p)<'a'),如果结果为真,则(*p+=('a'-'A')) 将是输出否则(*p)。所以这里看起来像((--*p)<'a'),即'r' < 'a',这是错误的,所以只是(*p),但s[5]在这之后由于--*p而发生了变化。
s[0] s[1] s[2] s[3] s[4] s[5] s[6]
------------------------------------------
| T | v | N | n | F | r | \0 |
------------------------------------------
s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..
|
p points here due to p--
接下来,对于0x104 >= 0x100:这个
((--*p)<'a')?(*p+=('a'-'A')):(*p);
'E' < 'a' 即70 < 97 这是真的,所以这个(*p+=('a'-'A')) 被执行,即
*p = *p + ('a' - 'A')
= 'E' + (97 - 65)
= 'E' + 32
*p = 'e' /* now s[4] overwritten by e(previously F) */
现在数组看起来像
s[0] s[1] s[2] s[3] s[4] s[5] s[6]
------------------------------------------
| T | v | N | n | e | r | \0 |
------------------------------------------
s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..
|
p points here due to p--
同样的操作一直持续到0x100 >= 0x100。