【问题标题】:Initializing a char pointer C++ [duplicate]初始化一个char指针C++ [重复]
【发布时间】:2018-01-09 11:16:32
【问题描述】:

这怎么可能?

const char *cp = "Hello world";

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

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

【问题讨论】:

  • "Hello world" 这不是字符串。这就是为什么它是可能的。
  • 在 c 和 c++ 中,字符串是 char 元素的数组,数组等于第一个元素的地址
  • 这是一个 C 字符串。它的核心只是一个你不能修改的字符数组。

标签: c++ pointers char


【解决方案1】:

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

使用数组与获取第一个元素的指针是一样的,所以实际上一个地址操作符&,但它是隐含的,没有显式使用。 p>

正如你们中的一些人可能已经注意到的那样,在上面声明 cp 时,我使用了 const char * 作为类型,而在我的数组示例中,pointer1pointer2 我使用了非常量普通的 char *类型。不同的是编译器为字符串字面量创建的数组在C++中是constant,不能修改。尝试这样做会导致undefined behavior。相比之下,我在后一个示例中创建的数组是 not 常量,它是可修改的,因此指向它的指针不必是 const

【讨论】:

  • 非常好心的人,谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    指针只能用 & + 所指向对象的地址来初始化

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

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

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

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

    这怎么可能?

    之所以有效,是因为"Hello World" 是一个字符串常量。你不需要分配这块内存,这是编译器的工作。

    顺便说一句,如果您使用的是 c++,请始终使用智能指针而不是原始指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      相关资源
      最近更新 更多