通常在声明指针(例如int)时,必须为其分配内存地址:
int value = 123;
int* p = &value;
创建char指针时,可以为其指定char数组,而无需包含地址:
char* c = "Char Array";
这是如何工作的?它是否分配内存并指向它?为什么其他类型的指针不能做同样的事情?
答案 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 *
,并且仍然允许分配(带有关于弃用转换的警告)。