1
#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
请解释输出。为什么地址有增量?

4

3 回答 3

2

我看到的唯一可能令人困惑的是

++*p++

Postincrement 比解引用运算符具有更高的优先级,因此完全用括号括起来它看起来像

++(*(p++))

哪个 postincrementsp取消引用 的原始值p以获得 a char,然后预先增加 的值char,然后将新值打印printf为整数。

所以两者pp指向的东西都会增加。

于 2012-09-27T14:45:34.550 回答
0

您应该查看运算符的优先级。
该表达式由编译器++*p++评估((*p) + 1),并且它还有一个副作用:它增加*pand的值p。使用 ASCII 兼容的字符集,该指令在标准输出上打印11( )。'\n'+1 == 10+1 == 11第二次printf调用打印s[4]( 'c') 的值。

于 2012-09-27T14:48:56.310 回答
0

C中的指针只是表示内存位置的整数。C 中的数组总是在连续的内存块中。因此,当您有一个指向数组的第三个元素的指针,并从指针中添加 1 时,它指向第四个元素。

如果您对以下内容感到困惑++*p++:那是因为 pre-increment(++p)和 post-increment之间的不同(p++)。对于讨厌 C++ 的人来说,有一个简单的绰号:

“C++ - 改变语言,回归老问题”。

于 2012-09-27T14:49:49.110 回答