为什么 '(void *)&' 会获取变量的地址?
Why does `(void *)&` get the address of the variable?
有人能解释一下背后的逻辑吗?为什么选择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运算符获取操作数的地址,因为这是该运算符的用途。
为什么无效?
因为
&c
的类型是char*
,输出流将该类型的指针视为指向以null结尾的字符串的指针,其处理方式与所有其他指针不同。具体来说,字符串的内容将被输出。将不是指向以null结尾的字符串的指针的char*
插入字符流将导致未定义的行为。&c
不是指向以null结尾的字符串的指针。将另一种类型的指针插入字符流将导致输出地址的数字表示。该示例将
&c
转换为另一个指针类型,这样它就不会被视为以null结尾的字符串。所有对象指针都可以转换为
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指针。空指针不是指向空终止符字符的指针。这些都是完全不同的概念。
- 附加调试器并以编程方式获取变量地址 Visual Studio
- 变量地址的运算符[]是如何工作的
- C 给出了一个字符串列表,如何从类中获取各个变量地址
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 获取封装在命名空间中的静态变量地址
- 为什么分配的变量地址之间相差 16 个字节?
- 为什么在循环中定义的变量地址在每次迭代中都保持不变
- 是否可以使用指向语句中声明的变量地址的指针"if"
- 字符串从变量(&变量)地址的长度 - 嵌入式C
- 汇编:C++堆栈变量地址不同/错误?
- x 在变量地址中的意义是什么?
- 在哪里放置 HW BP 以捕获全局变量地址损坏
- C++变量地址不匹配
- 重载 std::ostream 运算符<<未调用,stream 获取变量地址而不是对象
- std矢量包含指针和变量地址.清理
- 注册变量地址
- 使用内联程序集获取变量地址
- 如果用调试信息编译,则通过其名称获取全局变量地址
- 如何在Visual Studio中复制变量地址
- 当堆栈内存中的变量地址分配给数据段或堆内存中的指针时,是否有任何错误?