【问题标题】:Why do we access the value of the bytes pointed at by the char* instead of the value of the pointers?为什么我们访问 char* 指向的字节的值而不是指针的值?
【发布时间】:2020-09-04 11:04:48
【问题描述】:

从本主题之前的问题中,我了解到指针指向字符串的第一个字符,并希望后面的字符占据字符串的一部分,直到出现空字符。 我的问题是这个声明例如是如何工作的:

 const char* name = "abc"; 

据我了解,const char* 的值不是短语“abc”,它是一个整数,它指向我记忆中“a”字符的位置。 这部分是我不明白的。为什么?

难道我们不应该只能通过首先取消引用指针来为字节赋值吗?

【问题讨论】:

  • 如果您使用 int 作为示例数据类型,我认为这个问题可以更好地集中到令您困惑的地步。在我看来,C++ 中类似 C 的“字符串”初始化的复杂性使这里的事情变得复杂。顺便说一句,您显示的代码似乎表明您正在用 C 语言而不是 C++ 思考。考虑相应地标记。抱歉,如果我对您的措辞猜得太多,只是想提供帮助。
  • 指针不是整数,即使您的实现模型的内存模型以这种方式寻址,称为平面地址空间,并且在当今的用户程序中很常见。指针就是指针。
  • 考虑通过添加显示您想要做什么的代码(或伪代码)来使问题更加清晰。也许我们可以帮助解决编译器错误。

标签: c++ pointers


【解决方案1】:
const char* name = "abc"; 

基本上是:

// compiler makes up a random name
static const char _abc_string_235o8v3tiue[4] = {'a', 'b', 'c', '\0'};
const char* name = _abc_string_235o8v3tiue;

简称:

// compiler makes up a random name
static const char _abc_string_235o8v3tiue[4] = {'a', 'b', 'c', '\0'};
const char* name = &_abc_string_235o8v3tiue[0];

【讨论】:

    【解决方案2】:

    为什么?因为这就是指针的作用,所以它们的值是一个内存地址。 "abc" 的类型实际上是 const char[4](一个用于空终止符)。并且数组可以衰减为指向其第一个元素的指针。

    难道我们不应该只能通过先取消引用指针来给字节赋值吗?

    没有。要将值分配给对象,请将该值分配给对象。当你想给指针指向的东西赋值时,你可以取消引用指针:

    int x;
    int* y = &x;  // <- initialize the pointer with address of x
    *y = 5;       // dereference y and assign 5 to x
    

    关于如何管理字符串文字的内存,我建议您参考这个答案:https://stackoverflow.com/a/2740728/4117728

    【讨论】:

    • 在您的示例中,如果我们要添加 std::cout &lt;&lt; y;,则输出将是一个十六进制数。如果我们对我的 ecample 中给出的 name 变量做同样的事情,它会输出“abc”而不是指向“a”的十六进制数。这就是我的理解停止的地方。
    • @Chef 你是什么意思?最后一行y的值没有变化
    • @Chef 适用于所有类型(可选 const)T except char,函数 std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, T*),打印指针值。 std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const char*) 假设它是一个以 nul 结尾的字符串并打印出来。这是一个怪癖,因为历史上将 nul 终止的 char 数组用作文本
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多