C++ 为什么这个可变变量的地址总是1?
我想检查变量的地址C++ 为什么这个可变变量的地址总是1?,c++,iostream,implicit-conversion,cout,memory-address,C++,Iostream,Implicit Conversion,Cout,Memory Address,我想检查变量的地址 volatile int clock; cout << &clock; volatile int时钟; coutiostreams会将大多数指针投射到void*以进行显示-但是volatile指针不存在转换。这样C++就回到隐式转换到布尔O/COD>。如果要打印地址,请显式强制转换为void*: std::cout << (void*)&clock; std::cout有一个操作符这是因为操作符没有过载是的,有一个自动转换。它只是自
volatile int clock;
cout << &clock;
volatile int时钟;
coutiostreams会将大多数指针投射到void*
以进行显示-但是volatile
指针不存在转换。这样C++就回到隐式转换到<代码>布尔O/COD>。如果要打印地址,请显式强制转换为void*
:
std::cout << (void*)&clock;
std::cout有一个操作符这是因为操作符没有过载是的,有一个自动转换。它只是自动转换为<代码>布尔O//> >,而不是<代码> Value>代码>,因为C++没有自动转换为代码> >空*>代码>指针(C确实,但是C++需要显式转换)@ BDONLAN:您已经得到了它。任何普通指针都可以隐式转换为void*
,需要强制转换的是void*
到T*
。目前的答案是不正确的。<代码> t*<代码>转换为 Value*/Cuth>是隐含的。@ BDONLAN抱歉,但是C++确实有一个隐式的转换:<代码> T*<代码> > <代码> Value*/Cuff>。书面回答是错误的,或者至少是不完整的;C++不支持的是隐式地丢弃<代码>易失性>代码> @ JAMESSKANZE,大概是因为非代码>易失性< /COD>指针>代码> Value对象允许精确地存储<代码>易失性< /代码>的内存缓存类型1不一定总是表示数值-可以是逻辑的嗯。可能的复制品比我快了一秒钟,urg:(。补充:在bdonlan提出的解决方案中,c样式转换为const\u cast
。就打印而言,这并不是一个真正的问题。
#include <iostream>
void foo(const void *a) {
std::cout << "pointer\n";
}
void foo(bool a) {
std::cout << "bool\n";
}
int main() {
volatile int x;
foo(&x);
std::cout << &x << "\n";
int y;
foo(&y);
std::cout << &y << "\n";
void foo(volatile void*);
foo(&x);
}
void foo(volatile void *a) {
std::cout << "now it's a pointer\n";
}
bool
1
pointer
0x22cd28
now it's a pointer