为什么可以将一个数组赋值给一个char指针?

Why can you assign an array to a char pointer?

通常当你声明一个指针(比如 int)时,你必须为其分配一个内存地址:

int value = 123;
int* p = &value;

当你创建一个字符指针时,你可以为它分配一个字符数组而不需要包含地址:

char* c = "Char Array";

这是如何工作的?它是否分配内存并指向它?为什么其他类型的指针不能做同样的事情?

How does this work?

字符串文字存储在可执行文件的只读数据部分(意味着它在编译期间被初始化)并且 c 被初始化为指向该内存位置。隐式 array-to-pointer conversion 处理其余部分。

请注意,将字符串文字转换为 char* 已被弃用,因为内容无论如何都是只读的;指向字符串文字时更喜欢 const char*

相关构造 char c[] = "Char Array"; 会在运行时将字符串文字的内容复制到 char 数组。

Why can't other type pointers do the same thing?

这是字符串文字的特例,为方便起见,继承自C。

其他类型的指针也可以做到这一点。字符串文字是字符数组,因此您不需要使用地址运算符来分配给指针。

如果您有一个整数数组,无论是 int * 还是 int[],您都可以将其分配给 int 指针,而无需使用地址运算符:

int intArray1[] = {0, 1, 2}; // fist array
int * intArray2 = new int[10]; // second array
// can assign without & operator
int * p1 = intArray1;
int * p2 = intArray2;

char * 只是具体说明字符串文字类型实际上是 const char * 并且仍然允许分配(带有关于弃用转换的警告)。