📜  C 中的 char s[] 和 char *s 有什么区别?

📅  最后修改于: 2021-09-11 03:49:12             🧑  作者: Mango

考虑以下 C 中的两个语句。两者之间有什么区别?

char s[] = "geeksquiz";
   char *s  = "geeksquiz";

以下是主要区别:

语句 ‘ char s[] = “geeksquiz” ‘ 创建了一个字符数组,它就像任何其他数组一样,我们可以执行所有数组操作。这个数组唯一特别的地方是,虽然我们用9个元素初始化了它,但它的大小是10(编译器自动添加’\0’)

#include 
int main()
{
    char s[] = "geeksquiz";
    printf("%lu", sizeof(s));
    s[0] = 'j';
    printf("\n%s", s);
    return 0;
}

输出:

10
jeeksquiz

语句’ char *s = “geeksquiz” ‘创建了一个字符串字面量。大多数编译器将字符串字面量存储在内存的只读部分。 C 和 C++ 标准说字符串字面量具有静态存储持续时间,任何修改它们的尝试都会产生未定义的行为。
s只是一个指针,像任何其他指针一样存储字符串字面量的地址。

#include 
int main()
{
    char *s = "geeksquiz";
    printf("%lu", sizeof(s));
  
    // Uncommenting below line would cause undefined behaviour
    // (Caused segmentation fault on gcc)
    //  s[0] = 'j';  
    return 0;
}

输出:

8

运行上面的程序也可能会产生一个警告“警告:不推荐使用从字符串常量到 ‘char*’ 的转换”。出现此警告是因为 s 不是常量指针,而是存储只读位置的地址。警告可以通过指向 const 的指针来避免。

#include 
int main()
{
    const char *s = "geeksquiz";
    printf("%lu", sizeof(s));
    return 0;
}
想要从精选的视频和练习题中学习,请查看C 基础到高级C 基础课程