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

时间:2015-12-05 16:41:50

标签: c++ arrays pointers string-literals

通常在声明指针(例如int)时,必须为其分配内存地址:

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

创建char指针时,可以为其指定char数组,而无需包含地址:

char* c = "Char Array";

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

2 个答案:

答案 0 :(得分:7)

  

这是如何运作的?

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

请注意,不推荐将字符串文字转换为char*,因为内容是只读的;在指向字符串文字时更喜欢const char*

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

  

为什么其他类型指针不能做同样的事情?

这是字符串文字的一种特殊情况,为方便起见,继承自C。

答案 1 :(得分:1)

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

如果你有一个整数数组,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 *,并且仍然允许分配(带有关于弃用转换的警告)。