为什么这个volatile变量的地址始终为1?

时间:2011-11-23 08:44:05

标签: c++ iostream implicit-conversion cout memory-address

我想检查变量的地址

volatile int clock;
cout << &clock;

但是它总是说x在地址1.我做错了吗?

3 个答案:

答案 0 :(得分:18)

iostream会将大多数指针投射到void *以供显示 - 但volatile指针不存在转换。因此,C ++回归到bool的隐式转换。如果要打印地址,请明确地转换为void*

std::cout << (void*)&clock;

答案 1 :(得分:17)

operator<<有一个const void*,但operator<<没有volatile void*,隐式转化不会删除volatile(它不会删除const也是。)

正如GMan所说,所指出的类型的cv资格应该与打印地址的业务无关。也许27.7.3.6.2中定义的重载应该是operator<<(const volatile void* val);,我不能立即看到任何缺点。但事实并非如此。

#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

答案 2 :(得分:0)

这是因为Parent : 000691195 CUSTNO : 115225036-AD COMPANY : BROOK FURNITURE RENTAL ADDRESS1 : 100 N FIELD DR city : LAKE FOREST STATE : IL ZIP : 600452580 Parent : 000691195 CUSTNO : 116952265-AD COMPANY : BROOK FURNITURE RENTAL ADDRESS1 : 100 N FIELD DR STE 220 city : LAKE FOREST STATE : IL ZIP : 600452598 没有超载,它指向operator <<,并且没有指针转换可以满足它。

根据C ++标准,

  

对于任何类型volatile,指向T的指针,指向T的指针和指向const T的指针都被视为不同的参数类型,参考volatile T },引用T,并引用const T

Operator << has no overload for pointers to non-static member,指向volatile或函数指针的指针,因此尝试输出此类对象会调用隐式转换为volatile T