奇怪的指针功能

时间:2013-05-29 15:43:45

标签: c function pointers

void r(char *str) 
{
    char *new = str;
    while (*str != '\0') {
        if (*str != ' ') *(new++) = *str;
        str++;
    }
    *new = '\0';
}   

我有这个功能,但我不理解if语句之后的代码。如果有人能向我解释,我将不胜感激。

4 个答案:

答案 0 :(得分:9)

此函数正在从传入的值str中删除空格。

*(new++) = *str;表示将指针指向new并取消引用它,以便我们可以使用它来存储它所指向的记忆位置。然后取str指向的值,并将其取消引用它指向的char。将该char分配给new所在的位置,然后将新指针移动到下一个位置。最后,如果str指针值是空格,则始终将str指针与str++一起移动。

如果以这种方式写的话可能会更清楚:

void r(char *str) 
{
    char *new = str;
    int newStringIndex = 0;

    for(int i=0; str[i] != '\0'; i++)
    {
         if (str[i] != ' ') 
         {
             new[newStringIndex++] = str[i];
         }
    }

    new[newStringIndex] = '\0';
} 

相同的代码功能,但使用for循环和数组索引而不是指针数学。

答案 1 :(得分:4)

该函数正在移除空格(就地) - 它将除空格之外的所有内容复制到与之前相同的字符串。

所以if语句说:“如果str中的字符不是空格,则将其复制到new”(与str在同一内存区域,但是当str遇到空格时会开始跟踪)

请注意str总是递增,但new只在复制字符时递增。所以str会扫描整个字符串,但数据会被复制到字符串的前面,因为当有空格时new不会更新。

然后最后在new处添加一个终止空值,以便缩短的版本正确终止。

答案 2 :(得分:1)

这个版本的程序(K& R样式!)更短,也是如此:

void r(char *str) 
{
    char *new;
    for (new=str; *new = *str++; ) {
        if (*new != ' ') new++;
    }
}  

答案 3 :(得分:0)

while (*str != '\0') {
    if (*str != ' ') *(new++) = *str;
    str++;
}

相当于:

while (*str != '\0') {
    if (*str != ' ') {
        *new = *str;
        new++;
    }
    str++;
}