char * c = "world"; // works fine
但
int * p = 10; // throws an error
它需要像
int * p = new int(10); // in C++
int * p = (int*) malloc(1 * sizeof(*int)); // in C
如果指针要分配给某个内存或者它应该引用某个地址,那么为什么可以将字符串存储在字符指针中而不为其分配内存,为什么不是整数数据类型?
C 和 C++ 碰巧提供了一种语法,即字符串文字,用于创建char
具有指定初始值的数组类型的值。
在 C 中,字符串文字"world"
是类型char[6]
(5 表示字符串的长度加上 1 表示终止'\0'
)。在 C++ 中,它的类型是const char[6]
. 区别在于历史原因。在任何一种语言中,字符串文字都应始终被视为只读。
和任何数组类型的表达式一样,在大多数情况下,它被隐式转换为指向其第一个元素的指针。这就是为什么
const char *c = "world";
已验证。字符串文字"world"
本身创建了一个匿名数组对象,并且初始化导致c
指向数组对象的第一个元素。
碰巧没有这种用于创建类型对象的内置语法int
。
嗯,实际上是有的。C99 添加了复合文字,让您可以编写:
int *p = (int[]){ 10 };
它创建了一个类型为 的数组对象int[1]
,具有相同的隐式转换为int*
. (C++ 没有复合文字。)(数组对象的生命周期取决于它出现的上下文;如果它在函数体内,则当封闭块完成时,数组将不复存在。字符串文字,另一方面手,具有静态存储持续时间并存在于程序的整个执行过程中。)
顺便说一句,这个:
int * p = (int*) malloc(1 * sizeof(*int)); // in C
是不正确的; 你想要int*
,没有*int
。但最好写成:
int *p = malloc(sizeof *p));
在 C中强制转换结果malloc
是不必要的,并且在某些情况下可以隐藏错误。并且 usingsizeof *p
使代码更加健壮;如果您稍后p
从a 更改为int*
a double*
,则只需在一个地方更改类型。
因为根据定义,字符串字面量具有类型char*
,即指向字符串第一个字符的指针。
指针变量应该存储地址。
char * c = "world"; // works fine
因为,"world"
在程序的只读块中分配了内存,因此"world"
得到了一些地址,这个地址存储在指针中c
int * p = 10; // throws an error
因为10
是常量整数并且尚未分配任何内存,因此它没有地址。我们不能10
在指针中存储常量,p
因为它不是地址。
这就是为什么我们这样做
int * p = new int(10); // in C++
int * p = (int*) malloc(1 * sizeof(int)); // in C
这会将内存分配10
给整数,并且该整数的地址存储在p
正确的位置