考虑以下两行代码:
const char *ptr = "Hello";
char arr[] = "Hello";
对于指针定义,"Hello"
字符串文字本质上是不可变,但ptr
变量本身可以改变并保持不同地址。
对于数组定义,"Hello"
字符串文字被复制到数组的位置,但是arr
不能 指向不同的位置;但是,数组保存的字符串是可变的,因此可以更改。
现在考虑以下两行代码:
const char * const ptr = "Hello";
const char arr[] = "Hello";
这里,由于 const char
限定符的作用,两个字符串都是不可变的——不过更有趣的是:将 ptr
定义为常量指针,它不能指向不同的地址。
这两行代码会导致相同的行为吗?如果最终效果相同,那么在实现上是否存在理论上的差异——例如,指针方法是否为匿名数组分配内存以保存指针本身之外的字符串,而数组方法仅为一个匿名数组分配内存数组?
最佳答案
这里有一些区别。
首先,这可能适用于某些实现,因为指针可以指向相同的内存:
const char * const ptr1 = "Hello";
const char * const ptr2 = "Hello";
ptr1 == ptr2;
但使用数组形式则不然。
不管怎么说,真正的区别在于它们的类型不同。特别是,char[]
版本在数组类型中保留了它的大小。所以 sizeof(arr)
给你数组的大小,而不是一个指针,你也可以创建指向数组的指针到 arr
。
关于c - const char * const 和 const char [] 有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16288397/