C++地址值为1(情况说明)

关于C++中地址值打印出来为1的情况;以下是测试代码:


#include 
#include 

using namespace std;

int main()
{
        const volatile  int a = 10; 
    
        cout << &a <<endl;
        int *p = (int *)&a;

        *p = 12; 

        cout<< "地址:"<< p << setw(20) << "a:" << &a <<endl;
        cout << *p << setw(10) << a << endl;


        return 0;
}

运行结果:

C++地址值为1(情况说明)_第1张图片

(1)因为cout << 似乎没有对(volatile int*)做重载运算符的操作,因此 << 输出符不认得volatile关键字,所以默认如果变量值大于0输出值为1(true),如果小于0 输出值为0(false),默认以bool型输出

(2)之所以被转成了bool类型是因为指针可以转换为 bool。空指针为 false、其它值为 true;因为bool默认的输出方式是值,所有输出的值是1,我们其实可以通过std中的boolalpha(把bool解析为true或false)打印一下

在这里插入图片描述

结果为:

在这里插入图片描述

(注:c++中例如函数指针也是没有对应的的输出函数std::basic_ostream::operator<< 输出时也会遇到这种情况的)


如果我们想把该地址打印出来也是可以的,有两种方式:


(1):使用C语言中的printf输出打印,c++中打印不了是因为c++中没有对应(volatile int*)的输出函数,因此可以使用printf

(2):把(volatile int*)类型强转为(void *)类型,因为cout>>的输出运算符中没有(volatile int *)类型导致输出不了,所有我们可以把它这个类型强转为它认识的类型就可以正常输出了

#include 
#include 

using namespace std;

int main()
{
        const volatile  int a = 10; 
    
        int *p = (int *)&a;

        *p = 12; 

        cout<< "地址:"<< p << setw(20) << "a:" << (void *)&a <<endl;
        printf("a:%p\n",&a);
        cout << *p << setw(10) << a << endl;


        return 0;
}

运行结果

结果

你可能感兴趣的:(C++,c++,cpp)