【发布时间】:2021-01-05 23:35:02
【问题描述】:
我正在学习 C 中的指针,我有几个问题。 下面是一段代码,仅供参考。
int var = 300;
char s[] = "Clang";
char *p = "Wonder";
我知道所有变量在内存中都有它们的地址。
var 和 s 和 p 等变量在内存中有自己的地址。
但我想知道常量是否也有内存地址。
300,"Clang","Wonder"自己有内存地址吗?
【问题讨论】:
-
300不是对象:它没有地址;"Clang"nd"Wonder"两者本身都是对象(类型数组分别为 6 和 7 字符)并有自己的地址。 您将"Wonder"的地址复制到您的代码中的p。 -
C 标准描述了一种计算模型,用于指定程序的行为方式。在该模型中,常量
300不是对象并且没有地址,而字符串会导致创建静态数组,它们是对象并且确实具有地址。然而,C 标准并不要求实现完全遵循模型。他们可能会优化程序并生成不同的代码,只要程序的可观察行为(例如其输出)相同…… -
... 如果编译器可以在没有它的情况下初始化
s(可能通过在指令中使用立即操作数)或者可以从至少在某种程度上编程。"Wonder"不太可能被删除,但这取决于p的使用方式。 -
s和p之间的另一个区别是,所有(除了少数例外)"Wonder"将存储在.rodata部分中并且不能修改。因此"Wonder"中的字符不能被修改。使用s,"Clang"只是用来初始化一个正则数组,可以修改s的内容。
标签: c pointers memory constants memory-address