这怎么可能?
const char *cp = "Hello world";
我目前正在阅读C ++入门,我发现了这个例子(我是一个非常初学者)。
为什么可以用字符串初始化char指针?我真的无法理解这个例子,据我所知,指针只能用&初始化。 +指向或解除引用的对象的地址,然后分配一些值。
答案 0 :(得分:4)
String literals实际上是常量字符数组(包括终结符)。
当你这样做时
const char *cp = "Hello world";
你使cp
指向该数组的第一个字符。
更多解释:数组(不只是使用char
数组的C风格字符串,而是所有数组)自然衰减指向第一个元素的指针。
实施例
char array[] = "Hello world"; // An array of 12 characters (including terminator)
char *pointer1 = &array[0]; // Makes pointer1 point to the first element of array
char *pointer2 = array; // Makes pointer2 point to the first element of array
使用数组与获取指向其第一个元素的指针相同,所以实际上是涉及的运算符&
的地址,但它隐含了未明确使用。
正如你们中的一些人可能已经注意到的那样,在宣布cp
以上时,我使用了const char *
作为类型,而在我的数组示例中使用了pointer1
和pointer2
我使用了非常量普通char *
类型。区别在于编译器为字符串文字创建的数组在C ++中是常量,它们不能被修改。试图这样做会导致undefined behavior。相比之下,我在后一个示例中创建的数组是 not 常量,它是可修改的,因此指向它的指针不必是const
。
答案 1 :(得分:2)
setPrefix()
是一个只有"Hello world"
类型的只读文字。请注意,最后一个元素是NUL-terminator const char[12]
,该语言被用作"字符串结尾"标记。为方便起见,C和C ++允许您使用围绕字母数字字符的\0
键入文字,并为您添加NUL终结符。
您可以通过名为指针衰减的机制将"
类型分配给const char[12]
类型。
答案 2 :(得分:0)
指针只能用&初始化+指向的对象的地址
int i = 0;
int *pointer = &i;
这是正确的,但它不是初始化指针的唯一方法。请看下面的例子。
int *pointer;
pointer = (int*)malloc(100 * sizeof(int));
这是通过为它分配内存来初始化指针的方式。
这怎么可能?
它有效,因为"Hello World"
是一个字符串常量。您不需要分配这个内存,它是编译器的工作。
顺便说一句,如果您正在使用c ++,请始终使用智能指针而不是原始指针。