【问题标题】:What are the modifiable char array types in c++?c++中有哪些可修改的char数组类型?
【发布时间】:2020-04-11 06:55:54
【问题描述】:

我正在尝试在 char 数组中综合我的知识,但我觉得我遗漏了一些东西。我只能想到这三个场景(说到堆栈,我不是在说做const int SIZE = 6; char *word = new char[SIZE];

案例1:不允许

char *word = "message"; 
word[0] = 'M';

情况2:允许

const int SIZE = 8;
char word[SIZE] = "message"; 
word[0] = 'M';

案例3:允许

char word[] = "message"; 
word[0] = 'M';

还有其他方法可以在 C++ 中创建 char 数组吗?如果可以,可以进行哪些修改?

【问题讨论】:

  • 你忘了std::array
  • 请注意,char *word = "message"; 在 C++11 及更高版本中是非法,甚至不应该编译(如果是这样,那么你的编译器有一个非标准扩展允许那)。字符串文字是只读数据,因此您必须(并且应该)使用指向 const 数据的指针,例如:const char *word = "message";
  • const auto word = ...; 是您可能想要的。

标签: c++ arrays pointers char stack


【解决方案1】:

还有其他方法可以在 C++ 中创建 char 数组吗?如果可以,可以进行哪些修改?

语法上是的,有

不可修改:

auto word1 = "abc";
const auto word2 = "abc";
constexpr auto word3 = "abc";
constexpr char word4 = "abc";
auto word5{"abc"};
const auto word6{"abc"};

可修改

char word7[]{"abc"};

【讨论】:

    【解决方案2】:

    如果你用 const 类型声明数组,你不能修改它。如果你用非常量类型声明它,你可以修改它。这是您需要记住的主要规则。

    语言的规则也可以防止您使用指针变量意外违反此规则。如果你有一个char*,你可以使用它来修改它指向的数组。如果你有const char*,你就没有。对于不可修改的数组(例如字符串文字),编译器不应允许您将其地址分配给char*。如果编译器允许案例 1 进行编译,则应使用适当的标志对其进行配置,使其不会编译。

    简而言之,可修改的数组类型就是非const的类型,你只能获得指向这样一个数组的非const的指针,因此也可以使用这样的指针进行修改。 (也就是说,除非你做了不安全的事情,比如使用const_cast)。

    【讨论】:

    • 我知道案例 1 行不通,所以我在它旁边写了“不允许”。感谢您的反馈!
    • @CSstudZ 那你有什么问题?
    • 我更新了答案,希望这能回答问题。
    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2019-10-19
    • 1970-01-01
    • 2017-11-10
    • 2016-08-24
    相关资源
    最近更新 更多