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

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

#include <iostream>
#include <iomanip>

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;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行结果:


(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 <stdio.h>
#include <iomanip>

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;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行结果


————————————————
版权声明:本文为CSDN博主「谢永奇1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/takashi77/article/details/108816292

 

posted @ 2023-06-13 09:41  imxiangzi  阅读(60)  评论(0编辑  收藏  举报