c - const char * const 和 const char [] 有区别吗?

标签 c arrays pointers constants c99

考虑以下两行代码:

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/

相关文章:

c++ - fopen 在 "w"模式下比在 "a"模式下花费更多时间

java - 使用 Arrays.toString 打印矩阵

mysql - Perl 和 DBI - 加载数组问题

c - 该行的指针解释宏

c - 在c中将ByteArray写入文件

C -- 在换行符上取消引用

java - java中如何构建和遍历链表数组?

c - 没有参数类型的函数指针?

c - 提示编写可重入求和函数

编译器错误消息定制