如果我们说:为什么字符串文字与指针相似?
char *p="name";
那么,我们该怎么办
if(p=="name"){
printf("able"};//this if condition is true but why?
为“名”这里是一个字符串文字,p
是包含字符串的基地址,那么为什么指针上面的声明工作正常?
如果我们说:为什么字符串文字与指针相似?
char *p="name";
那么,我们该怎么办
if(p=="name"){
printf("able"};//this if condition is true but why?
为“名”这里是一个字符串文字,p
是包含字符串的基地址,那么为什么指针上面的声明工作正常?
相同的字符串文字可以被认为是相同的并且因此具有相同的地址,这是未指定的行为。所以这不是可移植的行为。从草案C99标准部6.4.5
字符串文字:
它是未指定的这些阵列是否是不同的条件是它们的元件具有 适当的值。 [...]
如果你想比较两个字符串,你应该使用strcmp。
字符串常量是什么内存的引用,因此,当你做char *p="name";
这一点,它意味着什么,但:
|n |a |m | e
/
p
p
指向字符串文字的第一个字符。这样做:
p=="name"
评估为someAddress==someAddress
。但是,这种行为是未指定的。
好吧,让我们来看看它的功能。
p是指向name\0
的指针。所以,在这里你要比较p
(一个指针)和"name"
(也是一个指针)。那么,这将是唯一的方式是真实的是,如果你有某个地方p="name"
,即使如此,"name"
不保证指向同一个地方。
我相信你实际上是在寻找或者是strcmp
整个字符串比较或你想要做if (*p == 'n')
到p
字符串的第一个字符比较的n
字符
你想用strcmp() == 0
比较字符串而不是简单的==
,它只会比较指针是否相同。
表达式strcmp(p, "name") == 0
将检查两个字符串的内容是否相同。
C标准允许比较为真,但也允许为假(行为是未指定)。它依赖于执行常见字符串合并的编译器(为此gcc可以选择打开或关闭它)。
来自gcc 4.8。1个手册:
-fmerge-constants
试图合并相同的常数(字符串常量和浮点常数) 不同编译单元。如果汇编器和链接器支持,则此选项是优化编译的默认选项。 使用
-fno-merge-constants
来抑制此行为。 在级别为-O,-O2,-O3,-Os时启用。
-fmerge-all-constants
尝试合并相同的常量和相同的变量。
所以你看到的是一个编译器为两个"name"
文字执行字符串合并。
这是一个编译器优化。一个你不能依靠的。 –
与@余浩指出的极其类似的问题指出。相同的课程材料? – crashmstr