指针+数字

Pointer + Number

本文关键字:数字 指针      更新时间:2023-10-16

我有这样的代码:我如何调试与printf?

char *string = "something";
short i;  
i = strlen(string);
while (i-- && (*(string+i)==' ' || *(string+i)==''));
*(string+i+1) = '' ;

这是做什么的?

*(string+i)

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

*(string + i)

是等价的

string[i]

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

*(string+i)string[i]。所以*(string+i) == ''string[i] == 0是一样的

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

要使用printf进行调试,只需插入printf语句并查看变量的内容。例如:

char *string = "something";
short i;  
i = strlen(string);
printf("Debug i = %dn", i);
  • 后缀操作符——意味着i将被求值,然后在下一个序列点之前自减。

  • ,,操作符在左右操作数之间有一个序列点,因此i--出现在右操作数之前。

  • 因此string+i为原i - 1的值

  • *(string+i)保证与string[i]完全等价。前者只是可读性较差。

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

  • 我也怀疑真正的意图是在空格后添加一个null ?难道你不想去掉空格并在这里结束字符串吗?

  • 代码也是低效的,因为如果你从开始数到结束,遇到第一个空格,你可以停止迭代

换句话说,这段代码太糟糕了。您应该将其替换为如下内容:

char* ptr = strchr(string, ' ');
if(ptr != NULL)
{
  *ptr = '';
}