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

📅  最后修改于: 2021-05-25 23:55:55             🧑  作者: 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指针,而是存储了只读位置的地址。可以通过指向const的指针来避免该警告。

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