为什么可以将数组赋值给字符指针?

5
通常当您声明一个指针(例如 int)时,您需要将一个内存地址分配给它:
int value = 123;
int* p = &value;

当您创建一个字符指针时,可以将一个字符数组分配给它,而无需包含地址:

char* c = "Char Array";

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


你不能这样做,比如:char* c = &'a'; - Neil Kirk
注意,在C ++中char * c =“ char array”不会编译; 你是想问C吗? - edmz
@Daniel,如果你的C++编译器连警告都不会给出,那它真的很糟糕。 - David Schwartz
2个回答

7

这是如何工作的?

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

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

一个相关的构造是 char c [] =“Char Array”;,它会在运行时将字符串文字的内容复制到 char 数组中。

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

这是一种方便的特殊情况,从C语言继承而来。


1
其他类型的指针同样可以很好地完成这个任务。字符串字面量是字符数组,因此您不需要使用地址运算符来分配给指针。
如果您有一个整数数组,无论是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 *,仍然允许赋值(带有有关弃用转换的警告)。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接