这里 p 是一个字符指针,而不是数组!但编译器没有给出警告或错误?
char *p = "Vladimir";
答案1
这只是一个问题解释:*p
是一个字符,你是对的。
string.h
但来自或的C 例程stdio.h
将解释 p
作为指向第一的“字符串”的字符,其后的字符位于连续的地址p+1
,p+2
依此类推,并且约定以零字符'\0'
(由编译器隐式添加!)终止“字符串”。
我在这里使用引号表示“字符串”,因为 C(与 C++ 相反)根本没有原生字符串类型。
C 正是使用这个指向字符的指针来表示“字符串”。因此,C“字符串”不能包含'\0'
字符,并且总是使用一个char
更多的比第一眼看到的更大空间。
答案2
字符“Vladimar”被存储为字符串文字,存储在可执行映像的只读段中。指针被分配给起始地址字符串文字。
请注意,编译器会以空字符结尾字符串文字。C 中的字符串处理函数依赖于空字符结尾。当找到空字符结尾时,函数通常会停止处理字符串。因此,以下代码可行:
gets(p);
C 的一个怪癖是可以将非常量指针分配给只读字符串文字(在 C++ 中,这样做是无效的)。
“字符串文字”是来自源字符集的字符序列,用双引号 (" ") 括起来。字符串文字用于表示字符序列,这些字符合在一起形成以空字符结尾的字符串。