比较指针中的指向值,无需解除引用即可工作?

时间:2016-06-08 10:08:11

标签: c++ pointers

我可能不完全理解我的代码,或者不理解这是如何工作的。感谢任何评论。

我似乎能够在不解除引用它们的情况下比较2个字符串文字。

我做了:

if(tail->name==name) cout << "Match" << endl;

这似乎有效。 Tail-&gt; name和name都是char *字符串指针,* name是通过参数传递给函数的字符串文字。我不应该做一个* name == * name吗?

唯一的另一种解释是,它会比较指针指向的值,但它应该像它一样工作。

此致 ATV

2 个答案:

答案 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。但你不能依赖它。在这种情况下,比较字符串的内容而不是地址,如前面答案中所述。