我只是玩玩而已,只是不明白为什么第一个版本能用,而第二个版本却不能用?
using namespace std;
#include <iostream>
int main(){
int a,b;
double d{3035.4534536};
cout<<"Size of: int "<<sizeof (int)<<" double "<<sizeof (double)<<endl;
a=*((int*)&d);
b=((int*)&d)[1];
int dd[2]; //{a,b};
dd[0]=a; dd[1]=b;
cout<<"a: "<<a<<" |b: "<<b<<endl;
cout<<"d: "<<d<<" |: "<<*((double*)&dd)<<endl;
// int size=sizeof(d)/sizeof(int)+1, *temp= new int[size],
// *f{(int*)(&d)}, *t{temp}, *s{t+size};
// while(t!=s) { *t=*f; ++f; ++t; cout<<"."; }
// cout<<"dOrig.: "<<d<<" |temp: "<<*((double*)&temp)<<endl;
// delete[] temp;
int size=sizeof(d)/sizeof(int)+1, *temp= new int[size];
char *f{(char*)&d}, *t{(char*)temp}, *s{t+sizeof(d)};
while(t!=s) { *t=*f; ++f; ++t; cout<<"."; }
cout<<"dOrig.: "<<d<<" |temp: "<<*((double*)&temp)<<endl;
delete[] temp;
}
...我知道,"这正是为什么会有容器",这纯粹是好奇,我只是想了解第二个版本的问题是什么?
是否有一个我不知道的转换?还是new-Statement返回的指针比指向第一个元素的普通指针要多?
a=*((int*)&d);
是不正确的。当你做(int*)时,你使用的是reinterpret_cast。
&d
是一个指针到双数。你不能将一个指针到双数转换为指针到int。好吧,你可以,但你不能做下一个操作,去引用它。当你试图读取内存点时,你就会用 (int*)&d
作为一个整数,你会得到未定义的行为。
从那里发生的事情是,嗯,复杂的和未定义的。不要去那里。