C字符串和char数组声明

Not*_*ohn 1 c c++ arrays string pointers

鉴于这些是允许的:

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

为什么不允许这样做?

char *c = {'a','b','c','\0'};  // error: a char cannot initialize a char*
Run Code Online (Sandbox Code Playgroud)

如果编译器将字符串文字解释为以字符结尾的字符数组,那么我认为它等同于上面的语句3,不是吗?

同样,为什么不允许这样做:

int arr[3];
int *i = arr; // OK
int *i = {1,2,3} // error: an int cannot initialize an int*
Run Code Online (Sandbox Code Playgroud)

这不是一个大问题,我只是好奇..我猜这个问题归结为字符串文字(或声明的整数数组)和字符元素数组在分配指针时有什么区别?

Car*_*rum 9

数组不是指针.使用字符串文字初始化字符数组是一种特殊情况(6.7.8#14):

字符类型数组可以由字符串文字初始化,可选地用大括号括起来.字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.

(6.7.8#16):

否则,具有聚合或联合类型的对象的初始值设定项应该是元素或命名成员的大括号括起来的初始值设定项列表.

至于指针初始化(6.7.8#11):

标量的初始值设定项应为单个表达式,可选择用大括号括起来.对象的初始值是表达式的初始值(转换后); 与简单赋值相同的类型约束和转换适用,将标量的类型作为其声明类型的非限定版本.