指针+数字

时间:2014-03-27 12:14:33

标签: c++ c

我有这个代码: 我如何用printf调试?

char *string = "something";
short i;  

i = strlen(string);

while (i-- && (*(string+i)==' ' || *(string+i)=='\0'));

*(string+i+1) = '\0' ;

这是做什么的?

*(string+i)

3 个答案:

答案 0 :(得分:3)

根据C标准,表达式e1[e2] 按照定义 等同于*(e1+e2)。所以当你写

*(string + i)

等同于

string[i]

这个定义有一个有趣的副作用,实际上写3[s]而不是s[3]是正确的,因为operator []是可交换的。

答案 1 :(得分:1)

*(string+i)string[i]。因此*(string+i) == '\0'string[i] == 0相同。

这是因为pointer + numberpointer + number * sizeof(type)的地址相同(在您的情况下string + istring + i * sizeof(char)相同。当您索引数组{{1}时}是地址arr[i]的元素。

要使用arr + i * sizeof(type)进行调试,只需插入printf语句并查看变量内容即可。例如:

printf

答案 2 :(得分:1)

  • 后缀运算符 - 表示i将在下一个序列点之前进行评估然后递减。

  • &&运算符在左右操作数之间有一个序列点,因此在评估右操作数之前会出现i--

  • 因此string+i是指原始i - 1的值。

  • *(string+i)保证与string[i]完全等效。前者只是一种不太可读的形式。

  • 代码做了一个特殊的检查。如果一个字符是空终止符,它会在第一个字符后面添加另一个空终止符。这没有任何意义。只有空间检查才有意义。

  • 我也怀疑真正的意图是在空格后加一个null?难道你不想删除空间并在那里结束字符串吗?好像是个错误。

  • 此外,代码效率低下,因为如果从头到尾计算并遇到第一个空格,则可以停止迭代。

换句话说,这段代码很糟糕。你应该用这样的东西替换它:

char* ptr = strchr(string, ' ');

if(ptr != NULL)
{
  *ptr = '\0';
}