指向字符串的Char指针

-2 c

谁能解释一下为什么这段代码不起作用,这里是新手。

#include <stdio.h>

int main()
{
    char * ptr = "hello";
    int i, cnt =0;
    while(ptr[i] != NULL)
    {
        i++;
        cnt++;

    } 
}
Run Code Online (Sandbox Code Playgroud)

谢谢 !

试图理解这一点,ptr 指向包含 hello 的字符数组,如 'h'、'e'、'l'、'l'、'o'、'\0'。我正在尝试获取它的长度。

Lun*_*din 5

如果你使用一个像样的编译器并且正确配置了它(对于学习 C 的初学者推荐哪些编译器选项?),那么你会得到一个编译器错误:

错误:指针和整数之间的比较

因为ptr[i](a char)是整数类型,但也NULL可能是指针类型。

C 有一些令人困惑的术语。空指针空终止听起来很相似,但它们是完全不同的、不相关的东西。

  • 空指针是指向明确定义的任意位置的指针。
  • 您可以通过为指针分配一个空指针常量将其转换为空指针NULL就是这样一个空指针常量。
  • 以零结尾的字符串称为空终止字符串。即,一个正确的 C 字符串。尽管有这个名字,但这与空指针无关。

由于听起来相似且容易混淆的名称,空终止符有时会拼写为“NUL”并带有一个 L,以使其与空指针区分开来。

当我们想要编写表达空终止字符的自记录代码时,在 C 中执行此操作的标准方法是通过所谓的“八进制转义序列”:'\0'。它的值为零,但特殊的八进制表示法使其脱颖而出。

所以正确的修复方法是:while(ptr[i] != '\0')


此外,您没有将变量初始化i为零,这是另一个错误。当在一行上声明多个变量(例如 )时int i, cnt =0;,只有旁边的一个变量=会被分配初始化值,而不是两者都被分配。这就是为什么在同一行声明多个变量被认为是不好的做法的原因之一,始终要避免。


完全重写为更正确且可能更具可读性的内容将是:

#include <stdio.h>

int main()
{
    const char* ptr = "hello";
    int cnt=0;

    for(int i=0; ptr[i] != '\0'; i++ )
    {
        cnt++;
    } 
    printf("%d\n", cnt);
}
Run Code Online (Sandbox Code Playgroud)

(如果i在循环外部声明,我们也可以使用i代替cnt,因为当循环完成时它的值也将是 5。)