我对指针有误解。
const char* p = "Some text";
const char* q = "Some text";
if (p == q)
cout << "\nSAME ADDRESS!";
cout << "\np = " << p;
cout << "\nq = " << q; //same outputs "Some text"
在 Visual Studio 2015 中,语法 if (p == q)
不比较地址,它比较值...我认为它应该类似于 if ( *p == *q)
.
那么我该如何比较地址? 我想使用 if (&p == &q)
,但是 it's been said它将是指针的地址,而不是它们指向的地址。
最佳答案
我认为您混淆了两个不同的概念。如果您有两个任意类型的指针 p
和 q
,则 p == q
总是 比较存储的地址在指针而不是被指向的对象中。结果,声明
if (p == q)
测试 p
和 q
是否字面上指向同一个对象。至于为什么要返回相同的对象——作为优化,许多编译器会将所有具有相同值的字符串文字汇集到一个字符串文字中,并设置所有指针以共享它。这种优化节省了二进制文件的空间。这也是为什么写入字符串文字是未定义行为的原因 - 如果您可以写入字符串文字,那么您可能会不小心污染初始化为该文字的其他字符串。
独立地,streams 库经过专门编程,因此如果您尝试打印出 const char *
,它将把 const char*
视为指向以 null 结尾的字符串开头,然后打印出该字符串中的所有字符。
如果您想打印出地址,您可以先将指针转换为 void*
:
cout << static_cast<const void*>(p) << endl;
cout << static_cast<const void*>(q) << endl;
之所以可行,是因为流库的设计使得如果您尝试打印出不是字符指针的指针,它会显示地址。类型转换基本上告诉编译器“请忘记这实际上是一个 char*
,而是将其视为通用指针。”
同样,如果你想比较字符串本身,使用strcmp
:
if (strcmp(p, q) == 0) {
// Equal!
}
也就是说,在 C++ 中,您可能应该考虑使用 std::string
而不是 const char*
,因为它更安全且更易于使用。
关于c++ - Const char* 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35490327/