理解while循环中的字符指针

时间:2016-04-03 21:45:56

标签: c string pointers while-loop

我正在学习C,我在学习材料中遇到了这个功能。该函数接受字符串指针和字符,并计算字符串中的字符数。例如,对于字符串this is a stringch = 'i',函数将返回3 3次出现的字母i

我发现令人困惑的部分是在while循环中。我本来期望读取像while(buffer[j] != '\0')这样的程序,程序将循环遍历每个元素j,直到它读取空值。我不知道while循环在while循环中如何使用buffer,以及如何使用buffer++逐个字符递增程序,直到达到空值。我尝试使用调试,但由于某种原因它不起作用。提前谢谢。

int charcount(char *buffer, char ch)
{
int ccount = 0;
while(*buffer != '\0')
{
    if(*buffer == ch)
        ccount++;
    buffer++;
}
return ccount;  
}

3 个答案:

答案 0 :(得分:0)

在循环中,您正在递增指针buffer,直到它指向空字符,此时您知道您扫描了整个字符串。我们正在递增指针本身而不是buffer[j],而不是*(buffer+j)

当您说buffer++时,您将buffer中存储的地址增加一个。

一旦内部化了指针的工作方式,这段代码比使用单独索引扫描字符串的代码更清晰。

答案 1 :(得分:0)

buffer是指向一组字符,字符串或包含字符数据的内存缓冲区的指针。

*buffer将取消引用buffer处的值作为字符。这可以与空字符进行比较。

当您添加到buffer时 - 您要添加到地址,而不是它指向的值,buffer++将1添加到地址,指向下一个字符。这意味着现在*buffer会产生下一个字符。

答案 2 :(得分:0)

在C和C ++中,数组按顺序存储,并根据数据的第一个地址和长度存储数组。

因此* buffer实际上是第一个字节的地址,并且与buffer [0]同义。因此,您可以将buffer用作数组,如下所示:

int charcount(char *buffer, char ch)
{
    int ccount = 0;
    int charno = 0;
    while(buffer[charno] != '\0')
    {
        if(buffer[charno] == ch)
            ccount++;
        charno++;
    }
    return ccount;  
}

请注意,这是,因为字符串是空终止 - 如果您在*buffer指向的字符数组中没有空终止,它将继续读取;你失去了c知道阵列有多长的位。这就是为什么你看到这么多c函数传递指针和长度的原因 - 指针告诉它数组的[0]位置,你指定的大小告诉它保持读取的距离。

希望这有帮助。