Почему адрес этой изменчивой переменной всегда равен 1? - PullRequest
20 голосов
/ 23 ноября 2011

Я хотел проверить адрес моей переменной

volatile int clock;
cout << &clock;

Но он всегда говорит, что x находится по адресу 1. Я что-то не так делаю ??

Ответы [ 3 ]

18 голосов
/ 23 ноября 2011

iostreams приведут большинство указателей к void * для отображения, но для volatile указателей преобразование не выполняется.Таким образом, C ++ возвращается к неявному приведению к bool.Приведите к явному void*, если вы хотите напечатать адрес:

std::cout << (void*)&clock;
17 голосов
/ 23 ноября 2011

Существует 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
0 голосов
/ 29 сентября 2016

Это потому, что нет перегрузки для operator <<, которая принимает указатель на volatile, и нет преобразования указателя, которое могло бы удовлетворить его.

Согласно стандарту C ++,

для любого типа T, указатель на T, указатель на const T и указатель на volatile T считаются различными типами параметров, так как являются ссылкой на T, ссылкой на const T и ссылкой до volatile T.

Оператор << не имеет перегрузки для указателей на нестатический элемент , указателей на volatile или указателей на функции, поэтому при попытке вывода таких объектов происходит неявное преобразование в bool.

...