【c++ Primer 】 4.10复习题 12题(int)、(int&)和(int*)
2012-01-07 22:26
323 查看
(1)首先通过一个例子看(int)和(int&)的区别:
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // boolalpha 用符号形式表示真假
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;
输出:
1
1065353216
false
0
0
true
解释:
(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1;
(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)
因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。
但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意:
程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址中的内容当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。
(2)(int*)是将一个变量(此变量不能是浮点型,可以是整型、字符、指针)以地址的形式显示,和(int&)的原理一样,当(int&*)a出现时,它也相当于告诉它的上下文:“把这块地址中的内容当做一个地址看待!不要管它原来是什么。”
例如:
char p='a';
cout<<(int)p<<endl;
cout<<(int*)p<<endl;
输出:
97
00000061 //97的十六进制数
这在输出字符数组的首地址时十分有用:
char *p="abcd";
cout<<(int*)p<<endl;
否则cout<<p<<endl;
输出的是abcd,而不是其首地址。
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // boolalpha 用符号形式表示真假
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;
输出:
1
1065353216
false
0
0
true
解释:
(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1;
(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)
因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。
但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意:
程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址中的内容当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。
(2)(int*)是将一个变量(此变量不能是浮点型,可以是整型、字符、指针)以地址的形式显示,和(int&)的原理一样,当(int&*)a出现时,它也相当于告诉它的上下文:“把这块地址中的内容当做一个地址看待!不要管它原来是什么。”
例如:
char p='a';
cout<<(int)p<<endl;
cout<<(int*)p<<endl;
输出:
97
00000061 //97的十六进制数
这在输出字符数组的首地址时十分有用:
char *p="abcd";
cout<<(int*)p<<endl;
否则cout<<p<<endl;
输出的是abcd,而不是其首地址。
相关文章推荐
- 【c++ Primer 】 4.10复习题 12题(int)、(int&)和(int*)
- 【c++ Primer 】 4.10复习题 12题(int)、(int&)和(int*)
- 【c++ Primer 】 4.10复习题 12题(int)、(int&)和(int*)
- 强制转化 (int)、(int&)和(int*)的区别
- 指针和引用(int*、int&、int*&、int&*、int**)
- vector<int> 转换为 int*
- 指针和引用(int*、int&、int*&、int&*、int**)
- 取数组地址引发的血案(int*)(&a+1);(int*)((int)a+1);
- 函数参数为int*和int&的区别
- int a[5]={1,2,3,4,5};printf("%d\n", *((int*)(&a+1)-2);
- (int&)a与*(int*)&a
- (int*) 和 (int&)的区别
- int *ptr=(int*)(&a+1);
- 指针和引用(int*、int&、int*&、int&*、int**)
- int a[5]={1,2,3,4,5}; int *p=(int*)(&a+1); printf("%d",*(p-1)); 答案为什么是5?
- invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’
- 笔试算法题(12):整数的string到int转换 & 两个栈实现队列
- [C++基础]019_指针和引用(int*、int&、int*&、int&*、int**)
- invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’
- [C++基础]019 指针和引用(int*、int&、int*&、int&*、int**)