C 字符串

C 语言不存在字符串类型,不过C语言提供了字符串常量。事实上,C语言存在字符串的概念:它就是以NUL字节结尾零个或者多个字符。

字符串通常存在于字符数组中,这也是C语言没有显示的字符串类型的原因。由于NUL字节是用于终结字符串的(NUL不是一个可打印的字符),所以在字符串内部不能有NUL字节。不过,在一般情况下,这个限制不会造成问题。

  • 字符串常量的书写方式是一对双引号包围一串字符,如: "Hello", "\aWarning!\a", "Line 1\nLine 2 ", ""

  最后一个例子说明字符串常量可以是空的(不像字符常量) 

  1. 字符串赋值 有2种方式
    // 指向char型的常量指针
    char *s = "hello"; //位于全局静态区,只读,编译时就确定了
    printf("%p\n", s);
    // 字符数组
    char s1[6] = "world"; // <==> char s1[6] = {'w', 'o', 'r', 'l', 'd', '\0'};
    printf("%p\n", s1); //位于栈区,可修改,运行时确定
    char s[6];
    s = "hello";
    // 这样是错误的,原因就是不能把字符串常量赋值给字符数组
  2. 字符串修改
    1. K&R C:
       在字符串存储形式中,所有的字符和NUL终止符都存储在内存中某个位置。K&R C 中并没有提及一个字符串常量中的字符是否可以被程序修改,但清楚地表明具有相同值的不同字符串常量在内存中是分开存储。因此,许多编译器都是允许程序修改字符串常量。
    2. ANSI C 则声明如果对一个字符串常量进行修改,其效果是未定义的。它也允许编译器把一个字符串常量存储于一个地方,即使它在程序中多次出现。这就使修改字符串常量极其危险,因为对一个常量进行修改可能殃及程序中其他其他字符串常量。因此,许多ANSI C 编译器不允许修改字符串常量,或者提供编译时选项,让你自行选择是否允许修改字符串常量。在实践中,尽量避免这样做。如果你需要修改字符串,请把它存储在数组中。
  3. 字符串复制
    char s[6] = "hello";
    char ss[6];
    ss = s;
    // C中 这样也是错误的
    C语言中字符串复制必须strcpy函数实现, 但是在C++ 使用string类 ,上面的赋值操作是正确的。


  4. 字符串常量和指针
    字符串常量会生成一个"指向字符的常量指针"。 当一个字符串常量出现在一个表达式中,表达式使用的值是字符串常量所存储的地址,而不是字符本身。
    char *p = "hello";
    printf("%p\n", s); // 0x7ffceaac8f43
    printf("%p\n", s+1); // 0x7ffceaac8f44

     

  5.  strlen VS sizeof

    char s[] = "hello";
    printf("strlen: %d\n", strlen(s)); // 5
    printf("sizeof: %d\n", sizeof(s)); // 6
    
    char ss[10] = "hello";
    printf("strlen: %d\n", strlen(ss)); // 5
    printf("sizeof: %d\n", sizeof(ss)); // 10

     

  最后,附上参考链接

  1. Kenneth A.Reek .《C和指针》
  2. C语言中定义字符串的两种方式及其比较

posted @ 2020-08-28 23:18  lvpeng-333  阅读(209)  评论(0)    收藏  举报