2017-08-02 215 views
0

这怎么可能?初始化一个字符指针C++

const char *cp = "Hello world";

我目前正在读C++底漆,我发现这个例子(我是一个很初级)。

为什么有可能用字符串初始化字符指针?我真的不明白这个例子,据我所知,一个指针只能被初始化为& +对象的地址指向或解除引用,然后赋值。

+2

'“Hello world”'这不是一个字符串。这就是为什么它是可能的。 – DimChtz

+2

在c和C++中,字符串是char元素的数组,并且数组等于第一个元素的地址 –

+0

它是一个C字符串。在它的核心,它只是一个你不能修改的字符数组。 – StoryTeller

回答

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。相比之下,我在后一个示例中创建的数组是而不是常量,它是可修改的,因此指向它的指针不一定是const

+0

非常善良的人,谢谢! –

2

"Hello world"const char[12]类型的只读字面值。请注意,最后一个元素是NUL-终结符\0,语言将其用作“字符串末尾”标记。 C和C++允许您使用围绕字母数字字符的"来输入文字,以方便使用,并为您添加NUL终止符。

您可以通过称为指针衰减的机制将const char[12]类型指定给const char*类型。

0

指针只能用& +对象的地址初始化指出

int i = 0; 
int *pointer = &i; 

这是正确的,但它不是唯一的方式来初始化的指针。看下面的例子。

int *pointer; 
pointer = (int*)malloc(100 * sizeof(int)); 

这是你如何通过分配内存来初始化指针。

这怎么可能?

它的工作原理是因为"Hello World"是一个字符串常量。你不需要分配这个内存,这是编译器的工作。

顺便说一句,如果你使用C++,总是使用智能指针而不是原始指针。