如果我们说:
char *p="name";
那么我们该怎么做呢?
if(p=="name"){
printf("able"};//this if condition is true but why?
在这里,“name”是一个字符串字面量,p
是一个指针,它保存了字符串的基地址,那么为什么上述语句可以正常工作呢?
如果我们说:
char *p="name";
if(p=="name"){
printf("able"};//this if condition is true but why?
在这里,“name”是一个字符串字面量,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
将检查两个字符串的内容是否相同。