當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。 例:
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。
現在我們已經知道了,可以把指標的值當作乙個整數取出來,也可以把乙個整數值當作位址賦給乙個指標。
C語言指標型別和型別轉換
指標是強型別,意思是特定型別的指標變數存放特定型別變數的位址,比如int 需要乙個指向整形的指標來存放整形資料的位址,char 需要乙個指向字元型的指標來存放字元型資料的位址,那為什麼說指標是個強型別呢?指標不僅用來表示變數的位址,同時也得使用指標來解引用位址的內容,以此方便修改和使用變數的值。說到...
C語言指標強制型別轉換
一 舉例說明 上圖對應函式呼叫為int printf const char fmt,fmt為char 指標型別,所以共佔了32位位元組,但是 fmt執行的是乙個位元組,fmt 執行的是下乙個位元組,fmt得到乙個32位位址,char fmt得到是乙個執行位元組的指標,char fmt 4後正好執行了...
C語言指標強制型別轉換
概要 c語言中,任何乙個變數都必須占有乙個位址,而這個位址空間內的0 1 就是這個變數的值。不同的資料型別占有的空間大小不一,但是他們都必須有個位址,而這個位址就是硬體訪問的依據,而名字只是提供給程式設計師的一種記住這個位址的方便一點的方法。但是,不同的變數在機器中都是0 1 所以,我們不能簡單的通...