如何解决为什么`(void *)&`会得到变量的地址?
有人能解释一下这背后的逻辑吗?为什么void
?例如
#include <iostream>
using namespace std;
int main()
{
char c;
cout << (void *)&c;
return 0;
}
解决方法
cout << (void *)&c;
获取c
的地址,然后将其转换为void*
,然后打印指针。
这里的目的是打印变量 c
的地址。但是当将 char *
传递给 std::cout <<
时,它会尝试打印一个以空字符结尾的字符串。为避免这种情况(并打印实际地址),您必须先强制转换为 void*
。
更多解释:
std::ostream::operator<<
具有处理 char *
和 const char*
的 overload (2)。它假设 const char*
将指向某个最终以空字符 '\0'
结尾的字符串。这只是 C 和 C++ 中使用的约定。
您想避免这种情况,而是使用 overload (7) 打印地址。
,operator <<
类型为 char *
类型的对象重载,这样它输出字符就好像使用的指针是指向 C 字符串(字符序列以零字符 '\0'
结尾)。
没有强制转换的表达式 &c
的类型为 char *
。因此,运算符假定传递的指针表达式 &c
提供指向 C 字符串的指针。
要输出对象 c
的地址,您需要将表达式 &c
转换为类型 void *
。
这是一个演示差异的简单程序。
#include <iostream>
int main()
{
const char *s = "Hello";
std::cout << s << '\n';
std::cout << static_cast<const void *>( s ) << '\n';
return 0;
}
程序输出为
Hello
0x5598fd4a3004
,
为什么(void *)&
会得到变量的地址?
一元 &
是 addressof 运算符。 addressof 运算符获取操作数的地址,因为这是该运算符的用途。
为什么无效?
因为
-
&c
的类型是char*
,该类型的指针被输出流视为指向空终止字符串的指针,其处理方式与所有其他指针不同.具体来说,将输出字符串的内容。将不是指向空终止字符串的指针的char*
插入到字符流中会导致未定义的行为。&c
不是指向空终止字符串的指针。将另一种类型的指针插入字符流将导致输出地址的数字表示。该示例将
&c
转换为另一种指针类型,以便它不会被视为以空字符结尾的字符串。 -
所有对象指针都可以转换为
void*
,因此这是通常选择用于输出字符地址的指针类型。
更多细节,字符流插入操作符有重载:
operator<<(ostrea&,const char*);
operator<<(ostrea&,const void*); // I'm cheating a bit
// this is technically a member overload
那么当且仅当变量为 NULL 时,我是否需要将其转换为 void*?
完全没有。变量 c
不为空。并且指针是否为空对是否需要转换为void*
没有影响。
另请注意,空终止符 - 终止空终止字符串 - 不是空指针。并且空指针不是指向空终止符的指针。这些是完全不同的概念。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。