同型別,不同型別的互轉(宣告型別與資料型別)

宣告型別有int,char,double...等等。(const為修飾詞,是屬於另外加在型別前)
資料型別有陣列、指標、指標陣列...等等。
指標類型可以依照使用者自行去定義資料型別(int,double,char...等)後加入應用,當指標與指標之間有型別上的不同,且使用者有轉型需求的情況下,C語言又提供透過void類型的指標當成中繼轉換,例如:
int A;
void *change=&A;
double *B=*change;

補充資訊(同一列皆可互換):

同類型別轉換(整數與整數,浮點數與浮點數)
double = float   //(O)
int = char          //(O)

整數與浮點數型別轉換
1.須注意精度問題,高精度轉到低精度會降低其精度(好像廢話=_=)
2.注意可能會有溢位造成精度上的或未定義行為的問題。
float = double   //(O)無條件捨去
double = int      //(O)


陣列部分
int a[5];
int *b;
const int *c;

陣列隱形轉性成指向低一個元素的指標(同類型別)
b=a;//(int*) = (int [5]) //(O)
a=b;//(int [5]) = (int *)//(X)

(type*) to (const type*)(同類型別)
c=b;//const int * = int *;(O)
b=c;//int * = const int *;(?)失去const意義且可能造成程式上無法預料或無法控制的結果


指標與指標之間
int *intA;
double *doubleB;
doubleB = &intA   //(?)沒有強制禁止,但卻是不正確的行為(效果無法保證)

如最前面所述,若有不同的指標與指標之間互相轉換,C有提供void *給使用者作兩者之間的中繼。
所有型別的指標都可以轉成void指標,且void指標都可以轉成所有型別的指標,這是少數C語言有定義的行為。void *有點類似泛用型別
(void * = ∫)(float * = void;)

int A;
void *change=&A;
double *B=*change;

透過void *來讓double *合法取得int *,但是void * 有一個特色,就是他無法被取值。
所以printf("%d\n", *change);是錯誤的(X),需要再轉向另一型別的指標(B=chang;之後printf B),C語言沒有禁止這種行為,但是因為在不同平台或編譯器可能會造成有不同的轉換情形,所以當你一定要轉換,就需要使用void*中繼來進行不同型別的指標轉換。
警告:這樣處理不一定會到達使用者所預期的結果。

留言