我可能不完全理解我的代码,或者不理解这是如何工作的。感谢任何评论。
我似乎能够在不解除引用它们的情况下比较2个字符串文字。
我做了:
if(tail->name==name) cout << "Match" << endl;
这似乎有效。 Tail-&gt; name和name都是char *字符串指针,* name是通过参数传递给函数的字符串文字。我不应该做一个* name == * name吗?
唯一的另一种解释是,它会比较指针指向的值,但它应该像它一样工作。
此致 ATV
答案 0 :(得分:1)
它绝对正确,在某些情况下是一个非常好的优化。
但它有一个微妙之处。简单地比较指针将从不产生误报,但反之则不然:如果tail->name
指向不同的字符串到name
那么
如果字符串的内容相同,则if(tail->name==name)
将false
甚至。
因此,一般情况下,您无法使用此方法,但您需要使用类似strcmp
的内容,或者更好的是,std::string
答案 1 :(得分:1)
我似乎能够在不解除引用它们的情况下比较两个字符串文字。
更确切地说,您将指针与字符串文字进行比较,而不是文字本身。
我不应该改为使用* name == * name吗?
如果你打算只比较第一个字符,那么是的,虽然tail->name[0] == name[0]
在我看来会更具描述性。
如果您打算比较字符串的内容,那么您必须取消引用指针并并行迭代每个字符串,比较沿途的字符。存在标准函数:std::strcmp
。
如果您想要比较指针,那么您当前正在做的事情是正确的。请注意,相同但单独的字符串文字不能保证具有相同的地址,因此这可能无法正常工作。这取决于您的用例,这种方法是否合适。
我将尝试用一个例子来解释:
const char* argument = "test";
const char* name = argument;
const char* another_name = argument;
assert(name == another_name);
断言保证是真的,应该没有什么奇怪的。指针是彼此的副本,并指向存储字符串文字的相同地址。
然而:
const char* name = "test";
const char* another_name = "test";
assert(name == another_name);
这种说法不能保证是真的。但它也不能保证是假的。它没有具体说明,直到实施。相同的字符串文字可以具有相同的地址也就不足为奇了,它是common optimisation。但你不能依赖它。在这种情况下,比较字符串的内容而不是地址,如前面答案中所述。