为什么 '(void *)&' 会获取变量的地址?

Why does `(void *)&` get the address of the variable?

本文关键字:变量 地址 获取 void 为什么      更新时间:2024-09-24

有人能解释一下背后的逻辑吗?为什么选择void?例如

#include <iostream>
using namespace std;
int main()
{
char c;
cout << (void *)&c;
return 0;
}
cout << (void *)&c;

获取c的地址,然后将其强制转换为void*,然后打印指针。

此处的目的是打印变量c的地址。但是,当将char *传递给std::cout <<时,它将尝试打印以null结尾的字符串。为了避免这种情况(并打印实际地址(,您必须先转换为void*


更多解释:

CCD_ 8具有处理CCD_ 9和CCD_。它假设const char*将指向某个字符串,该字符串最终由空字符''终止。这只是C和C++中使用的一个约定。

您希望避免这种情况,而是使用重载(7(打印地址。

operator <<为类型为char *的对象重载,以便输出字符,就好像使用的指针是指向C字符串的第一个字符(以零字符''结束的字符序列(的指针一样。

并且没有强制转换的表达式CCD_ 16具有类型CCD_。因此,运算符假定传递的指针表达式&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运算符获取操作数的地址,因为这是该运算符的用途。

为什么无效?

因为

  1. &c的类型是char*,输出流将该类型的指针视为指向以null结尾的字符串的指针,其处理方式与所有其他指针不同。具体来说,字符串的内容将被输出。将不是指向以null结尾的字符串的指针的char*插入字符流将导致未定义的行为。&c不是指向以null结尾的字符串的指针。将另一种类型的指针插入字符流将导致输出地址的数字表示。

    该示例将&c转换为另一个指针类型,这样它就不会被视为以null结尾的字符串。

  2. 所有对象指针都可以转换为void*,因此这是传统上为输出字符地址而选择的指针类型。


关于更多细节,字符流插入运算符有重载:

operator<<(ostrea&, const char*);
operator<<(ostrea&, const void*); // I'm cheating a bit
// this is technically a member overload

那么,当且仅当变量为NULL时,我是否需要将其转换为void*?

一点也不。变量c不为null。指针是否为空对是否需要转换为void*没有影响。

还要注意,null终止符字符(用于终止以null结尾的字符串(不是null指针。空指针不是指向空终止符字符的指针。这些都是完全不同的概念。