【问题标题】:char* doesn't hold the memory address [duplicate]char* 不保存内存地址[重复]
【发布时间】:2021-04-08 03:24:46
【问题描述】:

我一直在自学 C 和 C++,并且对指针有点熟悉。我的主要问题是 const char* 是否真的存储了内存地址? 这个问题是在处理字符串时出现的。如何将字符串分配给应该保存内存地址的内容?

#include <iostream>

int main(void) {
    const char* x = "Hello";
    std::cout << x << std::endl; // Returns Hello
    std::cout << &x << std::endl; // Returns the actual address
}

据我所知,上面的代码应该打印一个内存地址,那么 char* 究竟是什么?

【问题讨论】:

  • 我强烈建议不要尝试同时学习两种语言。它们是不同的语言,但也非常相似,以至于您最终会过度混淆自己。
  • 指针类型可以用数组初始化。在 C 和 C++ 中。字符串文字"Hello" 是一个字符数组。您的指针变量x 指向第一个数组元素。此外,在 C++ 中,我们不需要使用 void 来表示函数不接受任何参数。一个简单的int main() {} 签名就可以了。
  • x 包含字符串文字 "Hello" 的第一个字符的地址。输出流的operator&lt;&lt;() 有多个重载。一个接受 const char * 参数,该参数将在该地址输出字符,直到它到达 nul 字符(打印 Hello)。另一个重载接受void * 参数并输出(表示)实际地址。如果您执行std::cout &lt;&lt; (void *)x,它将调用接受void *operator&lt;&lt;() 重载,并因此打印x 中包含的地址(与&amp;x 的值不同)。

标签: c++ string pointers


【解决方案1】:

char* 实际上存储了一个地址。当您分配一个常量字符串时,C++ 将该常量字符串放在方便的地方(可能在可执行文件的.DATA 部分中)并将指向它的指针存储在变量x 中。特别是,这是常量字符串是const 的原因之一。 const char* 指向的文本字符串可能会在代码的其他地方使用。

请注意,cout 在打印字符数组时具有特殊行为。当您执行&amp;x 时,您实际上得到的是局部变量的地址,即const char** 类型的东西。如果您想要字符串的实际地址,可以使用(void*)x 来抑制通常的字符串打印行为。

【讨论】:

  • 值得一提的是string literal"Hello"具有静态存储时长.DATA 部分是实现/硬件特定的细节。
【解决方案2】:

const char* 确实拥有一个内存地址,而不是字符串。为了使它工作,编译器需要执行一些“魔术”:它将字符串文字的 content 放在内存中的某个地址,然后将该地址设置为您的 const char* 指针.因此,指针存储了字符串首字符的内存地址。

这样做的一个后果是你不能直接从const char*指针获取你的字符串的长度:你需要通过一个函数来获取长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2013-12-22
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多