【问题标题】:Is const char* a string or a pointerconst char* 是字符串还是指针
【发布时间】:2018-09-25 03:50:34
【问题描述】:

我认为 const char* 表示指向不可变字符串的可变指针。

但是,当我这样做时,

#include <iostream>
using namespace std;

const char *name1 = "Alex";

int main() 
{
   name1 = "John";
   cout << name1 << endl;
}

它只是打印 John 并且没有显示任何问题。我想知道为什么程序将 name1 视为字符串并使其可变?

【问题讨论】:

  • 它是“字符数组,零终止”意义上的“字符串”,而不是std::string 意义上的“字符串”。指针是可变的。要创建一个 const 指针,const char * const name1 = "Alex";.

标签: c++ string pointers


【解决方案1】:

我想知道为什么程序将 name1 视为字符串并使其可变?

注意const* 的顺序。如果您想禁止重新绑定name1,请使用char * const。另见What is the difference between const int*, const int * const, and int const *?

此外,const 不是关于不可变的值,而是关于不可变的绑定。

【讨论】:

    【解决方案2】:

    仅用于说明/比较(除了已经给出的答案):反例......

    const char *name1 = "Alex";
    
    int main() 
    {
        name1[0] = 'J';
        name1[1] = 'o';
        name1[2] = 'h';
        name1[3] = 'n';
        std::cout << name1 << std::endl;
        return 0;
    }
    

    现在您尝试真正修改不可变字符串。幸运的是,编译器检测到它并阻止您这样做! const_cast&lt;char&gt;(name[x]) = y; 将是下一次尝试。看起来像是在欺骗编译器,实际上,你只是通过撒谎来欺骗自己,结果会遇到未定义的行为

    实际上,强制转换 const 几乎总是一个坏主意(但它是合法的,如果且仅当指针包含一些最初非constly 创建的内存的地址)。

    【讨论】:

    • 我不认为每个人的下一个尝试是使用const_cast :)
    • @Rakete1111 嗯,是不是觉得后面这句话不够明确?
    • 我只是想搞笑,我觉得没关系:)
    【解决方案3】:
    • 它是一个指针
    • 指针是内存中的地址。
    • 在这里您将“John”的地址重新分配给 name1。
    • cout 知道如何打印 char *,因此您可以正确查看内容。

    程序中没有字符串对象

    【讨论】:

      【解决方案4】:

      我想知道为什么程序将 name1 视为字符串并使其可变?

      它没有,您只是为指针分配了一个新地址("John" 的地址)。你自己说过“一个可变指针指向一个不可变的字符串”。您修改了指针,并且如果您尝试实际修改指针对象,类型系统会阻止您这样做(由于 const 限定符)。

      【讨论】:

      • 实际上,它是一个指向不可变字符的可变指针,该字符是位于可执行文件文本部分的字符数组的一部分。
      【解决方案5】:

      这是一个指针,通过将它分配给“John”,您可以让它指向另一个“John”开始的案例内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多