初始化一个字符指针C++
这怎么可能?初始化一个字符指针C++
const char *cp = "Hello world";
我目前正在读C++底漆,我发现这个例子(我是一个很初级)。
为什么有可能用字符串初始化字符指针?我真的不明白这个例子,据我所知,一个指针只能被初始化为& +对象的地址指向或解除引用,然后赋值。
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。相比之下,我在后一个示例中创建的数组是而不是常量,它是可修改的,因此指向它的指针不一定是const
。
非常善良的人,谢谢! –
"Hello world"
是const char[12]
类型的只读字面值。请注意,最后一个元素是NUL-终结符\0
,语言将其用作“字符串末尾”标记。 C和C++允许您使用围绕字母数字字符的"
来输入文字,以方便使用,并为您添加NUL终止符。
您可以通过称为指针衰减的机制将const char[12]
类型指定给const char*
类型。
指针只能用& +对象的地址初始化指出
int i = 0;
int *pointer = &i;
这是正确的,但它不是唯一的方式来初始化的指针。看下面的例子。
int *pointer;
pointer = (int*)malloc(100 * sizeof(int));
这是你如何通过分配内存来初始化指针。
这怎么可能?
它的工作原理是因为"Hello World"
是一个字符串常量。你不需要分配这个内存,这是编译器的工作。
顺便说一句,如果你使用C++,总是使用智能指针而不是原始指针。
'“Hello world”'这不是一个字符串。这就是为什么它是可能的。 – DimChtz
在c和C++中,字符串是char元素的数组,并且数组等于第一个元素的地址 –
它是一个C字符串。在它的核心,它只是一个你不能修改的字符数组。 – StoryTeller