C 中的字符串和以 Null 结尾的字符数组之间真的有什么区别吗

mr.*_*oop 2 c arrays string

想问一下字符串是以空字符结尾的字符数组是否可以在 c 中互换。喜欢

    char string3[] = "abc";
    char string4[4] = {'a','b','c','\0'};

    if(!strcmp(string3,string4)){
        printf("yes");
    }
Run Code Online (Sandbox Code Playgroud)

连strcmp也给Yes。所以,只有初始化的区别,或者在深处有一些区别。

use*_*751 5

char string3[] = "abc";
Run Code Online (Sandbox Code Playgroud)

正是缩写

char string4[4] = {'a','b','c','\0'};
Run Code Online (Sandbox Code Playgroud)

并且没有区别。

但是,请注意

//  now it's a pointer
//   |
//   v
char *string3b = "abc";
Run Code Online (Sandbox Code Playgroud)

char string4[4] = {'a','b','c','\0'};
Run Code Online (Sandbox Code Playgroud)

等价的。每当您编写字符串并且不使用它初始化数组(指针不是数组)时,编译器都会为您创建一个数组。第一个基本上相当于:

static const char _magic_compiler_variable_for_abc_string[4] = {'a','b','c','\0'};
char *string3b = (char*)_magic_compiler_variable_for_abc_string;
Run Code Online (Sandbox Code Playgroud)

所以字符串被分配到其他地方并且string3b只保存一个指向它的指针。因为字符串变量是const(即使指针不是常量),在这种情况下您不能编辑字符串。编译器可能会_magic_compiler_variable_for_abc_string在您编写的任何地方使用相同的内容"abc",也可能会创建单独的内容。