第八章。指標型別轉換
當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。
在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。
例十四:
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=&
char *str;
b=(int)ptr;//
把指標
ptr 的值當作乙個整數取出來
。str=(char*)b;//
把這個整數的值當作乙個位址賦給指標
str 。
第八章 指標 第八章 指標
1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...
第八章 指標
指標 1,指標 指標,英文名是pointer,也叫位址,他是常量。他就是乙個記憶體空間的首位置。2,指標變數,位址變數 顧名思義,指標變數就是存放指標 位址 的變數。如果定義呢?short int p null 定義了乙個指標變數p,並且付給初始值為零。short int 就是型別。表示的是存放sh...
第八章 指標
1 8.3.1 指標基礎及指標運算 2 8.3.2 資料交換 3 8.3.3 字串反轉及字串連線 4 8.3.4 陣列元素奇偶排列 1 掌握指標的概念和定義方法。2 掌握指標的操作符和指標的運算。3 掌握指標與陣列的關係。4 掌握指標與字串的關係。5 熟悉指標作為函式的引數以及返回指標的函式。6 了...