C语言的指针*和引用
首先是一道關(guān)于類型轉(zhuǎn)換的面試題,要求給出float變量強(qiáng)制轉(zhuǎn)換成int型和int &輸出的結(jié)果。
[cpp] int test()?
{?
??? float a = 1.0f;?
??? cout<<"value of (int)a is "<<(int)a<<endl;?
??? cout<<"value of &a is "<<&a<<endl;?
??? cout<<"value of (int &)a is "<<(int &)a<<endl;?
??? cout<<boolalpha<<((int)a == (int &)a)<<endl;?
??? return 0;?
}?
int test()
{
?float a = 1.0f;
?cout<<"value of (int)a is "<<(int)a<<endl;
?cout<<"value of &a is "<<&a<<endl;
?cout<<"value of (int &)a is "<<(int &)a<<endl;
?cout<<boolalpha<<((int)a == (int &)a)<<endl;
?return 0;
}
以前編程經(jīng)常用到強(qiáng)制轉(zhuǎn)換(int)variable,對(duì)于上例,就是把float型的值1.0作為int型輸出1,但是如何理解(int &)variable,為什么輸出會(huì)是一個(gè)大整數(shù)1065353216呢?這里需要區(qū)分&的兩個(gè)作用:取地址和引用。以下是參考CSDN論壇的詳細(xì)解釋。
(int)a實(shí)際上是以浮點(diǎn)數(shù)a為參數(shù)構(gòu)造了一個(gè)整型數(shù),該整數(shù)的值是1,(int&)a則是告訴編譯器將a當(dāng)作整數(shù)看(并沒有做任何實(shí)質(zhì)上的轉(zhuǎn)換)。因?yàn)?以整數(shù)形式存放和以浮點(diǎn)形式存放其內(nèi)存數(shù)據(jù)是不一樣的,因此兩者不等。對(duì)float b = 0.0f;的兩種轉(zhuǎn)換意義同上,但是0的整數(shù)形式和浮點(diǎn)形式其內(nèi)存數(shù)據(jù)是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數(shù)值意義上)。
注意,程序的輸出會(huì)顯示?? (int&)a=1065353216,這個(gè)值是怎么來的呢?前面已經(jīng)說了,1以浮點(diǎn)數(shù)形式存放在內(nèi)存中,按ieee754規(guī)定,其內(nèi)容為0x0000803F(已考慮字節(jié)反序)。這也就是a這個(gè)變量所占據(jù)的內(nèi)存單元的值。當(dāng)(int&)a出現(xiàn)時(shí),它相當(dāng)于告訴它的上下文:“把這塊地址當(dāng)做整數(shù)看待!不要管它原來是什么。”這樣,內(nèi)容0x0000803F按整數(shù)解釋,其值正好就是1065353216(十進(jìn)制數(shù))。
通過查看匯編代碼可以證實(shí)“(int)a相當(dāng)于重新構(gòu)造了一個(gè)值等于a的整型數(shù)”之說,而(int&)的作用則僅僅是表達(dá)了一個(gè)類型信息,意義在于為cout<<及==選擇正確的重載版本。
我們?cè)倏醋兞恐惺褂弥羔?和引用&的例子,&作為引用主要是用在變量的聲明,也就是將此變量作為一個(gè)別名,兩變量?jī)?nèi)存地址完全相同。下面是對(duì)int *a, int &b, int * &c, int & *d的實(shí)驗(yàn)和簡(jiǎn)單說明。
[cpp] int test()?
{?
??? int i = 10;?
??? int *a = &i;??? /* a是一個(gè)指針,指向i的地址, &取地址 */?
??? cout<<"value of a is "<<a<<endl;? /* i的地址 */?
??? int &b = i;???? /* b是引用,和i指向同一地址,可視為i的別名 */?
??? cout<<"value of b is "<<b<<endl;? /* i的內(nèi)容,10 */?
??? cout<<"value of &b is "<<&b<<endl;??? /* i的地址 */?
??? int * &c = a;?? /* c是引用,引用的類型是指針(和a相同) */?
??? cout<<"value of c is "<<c<<endl;? /* c是a的別名 */?
??? /* int & *d = b;??? d是一個(gè)指針,但引用不是實(shí)體,所以是錯(cuò)誤的 */?
??? return 0;?
}
總結(jié)
以上是生活随笔為你收集整理的C语言的指针*和引用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图理解单链表的反转
- 下一篇: C/C++语言void及void指针深层