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
如果要将指针分配给某个内存,或者它应该引用某个地址,那么为什么字符串可以存储在字符指针中而不为其分配内存,为什么不是整数数据类型呢?
答案 0 :(得分:2)
C和C ++碰巧提供字符串文字的语法,用于创建具有指定初始值的char
类型的数组值。
在C中,字符串文字"world"
的类型为char[6]
(字符串长度为5,终止'\0'
为1)。在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
的结果,并且在某些情况下可以隐藏错误。使用sizeof *p
可以使代码更健壮;如果您稍后将p
从int*
更改为double*
,则只需在一个位置更改类型。
答案 1 :(得分:1)
因为根据定义,字符串文字的类型为char*
,指向字符串第一个字符的指针。
答案 2 :(得分:1)
指针变量应存储地址。
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
中,这是正确的