【问题标题】:Question about C++ character pointer关于C++字符指针的问题
【发布时间】:2011-08-08 01:28:16
【问题描述】:

我对 C++ 还是很陌生,我对看起来像这样的东西很困惑:

int main()
    {
         char* aCharPointer = "A bunch of characters";
         return 0;
    }

为什么你可以用字符指针来做到这一点?也许还有另一个地方有答案,但我不知道在哪里寻找或我在寻找什么。 感谢您的宝贵时间。

【问题讨论】:

  • 要添加到下面的答案,不要使用char* txt = "SomeText";;这是为了与 C 向后兼容而留下的过时转换。字符串文字是只读的,因此变量声明应为 const char* txt = "SomeText";

标签: c++ string pointers character


【解决方案1】:

这与 C 中的字符串有关(不要搞错,那是 C 字符串)。字符串是一个字符数组。以下代码:

char* txt = "Hello";

产生以下字符数组:

H|e|l|l|o|\0

而txt指向第一个元素。最后一个元素是一个空终止符,它是任何使用字符串的东西都知道字符串已经结束的方式。

附带说明,C 和 C++ 中的指针可以指向单个项目,也可以指向相同类型的项目数组。没有办法只看它就知道它是什么,但是按照惯例,如果你看到char* 的可能性非常好,它就是一个字符串。

过去如此,以后也将如此。阿门。

如果您想知道如何制作 C++ 字符串,请使用 std::string 类。

【讨论】:

  • 是的,我使用 c++ 字符串类,但我使用的函数使用 char* 参数。另外,这和我上面做的一样吗?:char* aCharPointer[21]; *aCharPointer = "一堆字符";
  • @Hudson:不,不一样。您的原始示例声明了一个指针并将其初始化为字符数组文字中第一个元素的地址。您的第二个示例声明了一个包含 21 个字符指针的数组,然后将第一个指针设置为字符数组文字中第一个元素的地址。
【解决方案2】:

这是一个 C 风格的字符串,这意味着它实际上是一个字符数组,字符串末尾有一个空(ASCII 代码 0)字符,表示它已经结束(编译器在它看到文字)。

字符指针指向数组中的第一个字符(这是因为数组decay into pointers,只要上下文需要它)。

指针可以应用p[i] 下标语法,这与*(p + i) 相同。这是在给定指向第一个元素的指针的情况下访问数组的 ith 元素的常用习惯用法。

使用这些事实,您可以通过这种方式遍历数组中的所有字符:

// '\0' is the null character
for (int i = 0; aCharPointer[i] != '\0'; ++i) {
    // Do something with aCharPointer[i]
}

或者这样:

for (char *p = aCharPointer; *p != '\0'; ++p) {
    // Do something with *p
}

您还可以调用需要指向 C 样式字符串的字符指针的函数:

#include <cstring>
size_t lengthOfString = strlen(aCharPointer);

当然,您也可以手动取消引用指针:

assert(*aCharPointer == 'A');

【讨论】:

  • 您在 for 循环中增加一个 char 并期望它到达字符串的末尾?祝你好运!
  • @Praetorian:是的,我很傻。我在你评论前不久修复了它;-)
【解决方案3】:

你能做什么?

“一堆字符”string literal。字符串文字静态分配在程序的常量部分中。 char *p = "LITERAL"; 的作用是在堆栈上创建一个指针以指向该字符串字面量。

由于p 指向一个常量,所以原来的定义应该是const char *p = "LITERAL"; 但是,为了向后兼容很多现有的C 代码,可以使用以前的定义形式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 2023-01-08
    • 1970-01-01
    • 2011-05-21
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多