8 讓你不再害怕指標 指標型別轉換

2021-05-27 02:10:41 字數 2081 閱讀 7154

當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。

例十五:

float f = 12.3;

float *fptr = &f;

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 = n //n 必須代表乙個合法的位址;

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。

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

8 讓你不再害怕指標 指標型別轉換

當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例十五 float f 12.3 float fptr f int p 在上面...

1 讓你不再害怕指標 細說指標

指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char ptr 3 in...

1 讓你不再害怕指標 細說指標

指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char ptr 3 in...