學習指標不可少的好文章 ( 八 )

2021-04-18 17:06:29 字數 1786 閱讀 5580

指標型別轉換

當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。 例十四: 1。 float f=12.3; 2。 float *fptr=&f; 3。 int *p; 在上面的例子中,假如我們想讓指標p指向實數f,應該怎麼搞?是用下面的語句嗎? p=&f; 不對。因為指標p的型別是int*,它指向的型別是int。表示式&f的結果是一 個指標,指標的型別是float*,它指向的型別是float。兩者不一致,直接賦值的方法是不行的。至少在我的msvc++6.0上,對指標的賦值語句要求賦值號兩邊的型別一致,所指向的型別也一致,其它的編譯器上我沒試過,大家可以試試。為了實現我們的目的,需要進行"強制型別轉換": p=(int*)&f; 如果有乙個指標p,我們需要把它的型別和所指向的型別改為tyep*和type, 那麼語法格式是: (type*)p; 這樣強制型別轉換的結果是乙個新指標,該新指標的型別是type*,它指向的型別是type,它指向的位址就是原指標指向的位址。而原來的指標p的一切屬性都沒有被修改。

乙個函式如果使用了指標作為形參,那麼在函式呼叫語句的實參和形參的結合過程中,也會發生指標型別的轉換。 例十五: void fun(char*); int a=125,b; fun((char*)&a); ... ... void fun(char*s) } 注意這是乙個32位程式,故int型別佔了四個位元組,char型別佔乙個位元組。函式fun的作用是把乙個整數的四個位元組的順序來個顛倒。注意到了嗎?在函式呼叫語句中,實參&a的結果是乙個指標,它的型別是int *,它指向的型別是int。形參這個指標的型別是char*,它指向的型別是char。這樣,在實參和形參的結合過程中,我們必須進行一次從int*型別到char*型別的轉換。結合這個例子,我們可以這樣來想象編譯器進行轉換的過程:編譯器先構造乙個臨時指標 char*temp,然後執行temp=(char*)&a,最後再把temp的值傳遞給s。所以最後的結果是:s的型別是char*,它指向的型別是char,它指向的位址就是a的首位址。

我們已經知道,指標的值就是指標指向的位址,在32位程式中,指標的值其實是乙個32位整數。那可不可以把乙個整數當作指標的值直接賦給指標呢?就象下面的語句: unsigned int a; type *ptr;//type是int,char或結構型別等等型別。 ... ... a=20345686; ptr=20345686;//我們的目的是要使指標ptr指向位址20345686(十進位制 ) ptr=a;//我們的目的是要使指標ptr指向位址20345686(十進位制) 編譯一下吧。結果發現後面兩條語句全是錯的。那麼我們的目的就不能達到了嗎?不,還有辦法: unsigned int a; type *ptr;//type是int,char或結構型別等等型別。 ... ... a=某個數,這個數必須代表乙個合法的位址; ptr=(type*)a;//呵呵,這就可以了。 嚴格說來這裡的(type*)和指標型別轉換中的(type*)還不一樣。這裡的(type*)的意思是把無符號整數a的值當作乙個位址來看待。 上面強調了a的值必須代表乙個合法的位址,否則的話,在你使用ptr的時候,就會出現非法操作錯誤。

想想能不能反過來,把指標指向的位址即指標的值當作乙個整數取出來。完全可以。下面的例子演示了把乙個指標的值當作乙個整數取出來,然後再把這個整數當作乙個位址賦給乙個指標: 例十六: int a=123,b; int *ptr=&a; char *str; b=(int)ptr;//把指標ptr的值當作乙個整數取出來。 str=(char*)b;//把這個整數的值當作乙個位址賦給指標str。

好了,現在我們已經知道了,可以把指標的值當作乙個整數取出來,也可以把乙個整數值當作位址賦給乙個指標。

學習指標不可少的好文章 ( 六 )

指標和結構型別的關係 可以宣告乙個指向結構型別物件的指標。例十一 struct mystruct mystruct ss 宣告了結構物件ss,並把ss的三個成員初始 化為20,30和40。mystruct ptr ss 宣告了乙個指向結構物件ss的指標。它的型別是 mystruct 它指向的型別是m...

讀到的好文章

呂氏春秋 中有這麼乙個故事 說是越王有四個兒子,有奸臣說你的大兒子要造反,越王就殺了大兒子 一段時間後奸臣有說你的二兒子要造反,二兒子也被宰了 奸臣就是奸臣,再度上奏說三兒子也要造反,造反當然立斬不赦。但是四兒子現在可不是這麼想的,心想我三個哥哥,奸臣一上奏就被砍頭了,我說不定哪天突然就被宰了,還不...

收藏的好文章

二叉樹遍歷之非遞迴演算法 石鍋拌飯的部落格 二叉樹遍歷的遞迴演算法 石鍋拌飯的部落格 二叉樹的遞迴建立 binary trees stanford cs education library binary trees pdf stanford cs education library 為什麼gets ...