#include <stdio.h>
int main(void)
{
char s[] = {'a','b','c','\n','c','\0'};
char *p;
p=&s[3];
printf("%d\t",++*p++);
printf("%d",*p);
return 0;
}
输出:11 99
请解释输出。为什么地址有增量?
#include <stdio.h>
int main(void)
{
char s[] = {'a','b','c','\n','c','\0'};
char *p;
p=&s[3];
printf("%d\t",++*p++);
printf("%d",*p);
return 0;
}
输出:11 99
请解释输出。为什么地址有增量?
我看到的唯一可能令人困惑的是
++*p++
Postincrement 比解引用运算符具有更高的优先级,因此完全用括号括起来它看起来像
++(*(p++))
哪个 postincrementsp
取消引用 的原始值p
以获得 a char
,然后预先增加 的值char
,然后将新值打印printf
为整数。
所以两者p
和p
指向的东西都会增加。
您应该查看运算符的优先级。
该表达式由编译器++*p++
评估((*p) + 1)
,并且它还有一个副作用:它增加*p
and的值p
。使用 ASCII 兼容的字符集,该指令在标准输出上打印11
( )。'\n'+1 == 10+1 == 11
第二次printf
调用打印s[4]
( 'c'
) 的值。
C中的指针只是表示内存位置的整数。C 中的数组总是在连续的内存块中。因此,当您有一个指向数组的第三个元素的指针,并从指针中添加 1 时,它指向第四个元素。
如果您对以下内容感到困惑++*p++
:那是因为 pre-increment(++p)
和 post-increment之间的不同(p++)
。对于讨厌 C++ 的人来说,有一个简单的绰号:
“C++ - 改变语言,回归老问题”。