當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。
例十四:
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)
char c;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
注意這是乙個32位程式,故int型別佔了四個位元組,char型別佔乙個位元組。函式fun的作用是把乙個整數的四個位元組的順序來個顛倒。注意到了嗎?在函式呼叫語句中,實參&a的結果是乙個指標,它的型別是int *,它指向的型別是int。形參這個指標的型別是char*,它指向的型別是char。這樣,在實參和形參的結合過程中,我們必須進行一次從int*型別到char*型別的轉換。結合這個例子,我們可以這樣來想象編譯器進行轉換的過程:編譯器先構造乙個臨時指標 char*temp,然後執行temp=(char*)&a,最後再把temp的值傳遞給s。所以最後的結果是:s的型別是char*,它指向的型別是char,它指向的位址就是a的首位址。
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。
好了,現在我們已經知道了,可以把指標的值當作乙個整數取出來,也可以把乙個整數值當作位址賦給乙個指標。
指標型別強制轉換
問題為下 include void main 輸出為啥不是1呢 這個時候,我們可以看到函式式裡面有格式的轉換,如果格式轉換時存在除void格式外,還有兩個及兩個以上的格式的轉換,則這時候的指標所指的variable所佔的記憶體會產生變化,從而會使格式發生相應的變化 對於本題 當你強行將int指標變為...
指標變數 指標強制型別轉換
一 什麼是指標變數?指標變數,實質上是乙個變數,只是它是存放位址的變數,指標的型別代表的是它所指向的變數的型別,因此就有了指向整形 字元型 浮點型等其他型別的指標。但實際上所有型別的指標變數存放的都是int型的位址 16位的編譯系統,int是2位元組 32的編譯系統,int是4位元組 本質上,不同型...
函式指標的強制型別轉換
先給出結論 函式指標是可以通過強制型別轉換而指向具有不同函式簽名的函式的,但是,轉換後,該函式指標沒辦法正確呼叫所指向的函式 不能給函式傳遞引數。下文給出得出這個結論的小故事。前幾天的任務要求寫乙個logger類,該類對外提供一些靜態的方法,但不生成物件。該類的主要作用是用來輸出訊息,不同的是可以由...