乐闻世界logo
搜索文章和话题

为什么字符串可以分配给char*指针,而不能分配给char[]数组?

5 个月前提问
4 个月前修改
浏览次数23

1个答案

1

在 C++ 中,字符串字面量,比如 "hello",本质上是一个字符数组,结尾包含一个空字符 ('\0') 以标识字符串的结束。这个字符串字面量在内存中有一个固定的地址,我们可以使用指针来引用这个内存地址。

使用 char* 指针

当我们将一个字符串字面量分配给一个 char* 类型的指针时,我们实际上是将这个字符串在内存中的地址保存到了指针中。例如:

cpp
char* ptr = "hello";

这里,"hello" 是一个常量字符串,存储在程序的只读数据段中。ptr 只是持有这个数据的地址,所以这种赋值是合法的。

使用 char[] 数组

然而,当我们尝试将一个字符串字面量分配给一个字符数组时,情况就不同了。例如:

cpp
char arr[] = "hello";

这种情况下,"hello" 字符串字面量的内容被复制到 arr 数组中。这是在编译时进行的初始化,数组 arr 实际上拥有了 "hello" 的一个副本。此后,arr 作为一个数组,拥有自己的内存空间,可以修改其中的内容。

但是如果试图在声明之后分配字符串到数组,如下:

cpp
char arr[10]; arr = "hello"; // 错误!

这是不允许的。因为数组名 arr 是一个常量指针,它的值(即数组的起始地址)不能被改变。一旦数组被声明,你不能再让它指向别的地址,而只能通过索引来操作或修改数组中的元素。

总结

  • 使用 char* 指针时,可以在任何时候将指针指向不同的字符串字面量或字符数组。
  • 使用 char[] 数组时,只能在声明时初始化字符串字面量,之后不能改变它指向的地址。

这种差异主要是由 C++ 的类型安全和内存管理规则决定的。

2024年6月29日 12:07 回复

你的答案