在 C++ 中,字符串字面量,比如 "hello"
,本质上是一个字符数组,结尾包含一个空字符 ('\0'
) 以标识字符串的结束。这个字符串字面量在内存中有一个固定的地址,我们可以使用指针来引用这个内存地址。
使用 char*
指针
当我们将一个字符串字面量分配给一个 char*
类型的指针时,我们实际上是将这个字符串在内存中的地址保存到了指针中。例如:
cppchar* ptr = "hello";
这里,"hello"
是一个常量字符串,存储在程序的只读数据段中。ptr
只是持有这个数据的地址,所以这种赋值是合法的。
使用 char[]
数组
然而,当我们尝试将一个字符串字面量分配给一个字符数组时,情况就不同了。例如:
cppchar arr[] = "hello";
这种情况下,"hello"
字符串字面量的内容被复制到 arr
数组中。这是在编译时进行的初始化,数组 arr
实际上拥有了 "hello"
的一个副本。此后,arr
作为一个数组,拥有自己的内存空间,可以修改其中的内容。
但是如果试图在声明之后分配字符串到数组,如下:
cppchar arr[10]; arr = "hello"; // 错误!
这是不允许的。因为数组名 arr
是一个常量指针,它的值(即数组的起始地址)不能被改变。一旦数组被声明,你不能再让它指向别的地址,而只能通过索引来操作或修改数组中的元素。
总结
- 使用
char*
指针时,可以在任何时候将指针指向不同的字符串字面量或字符数组。 - 使用
char[]
数组时,只能在声明时初始化字符串字面量,之后不能改变它指向的地址。
这种差异主要是由 C++ 的类型安全和内存管理规则决定的。
2024年6月29日 12:07 回复