初始化一个char指针C ++

时间:2017-08-02 09:46:32

标签: c++ pointers char

这怎么可能?

const char *cp = "Hello world";

我目前正在阅读C ++入门,我发现了这个例子(我是一个非常初学者)。

为什么可以用字符串初始化char指针?我真的无法理解这个例子,据我所知,指针只能用&初始化。 +指向或解除引用的对象的地址,然后分配一些值。

3 个答案:

答案 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 *作为类型,而在我的数组示例中使用了pointer1pointer2我使用了非常量普通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 ++,请始终使用智能指针而不是原始指针。