4.2.3
隱式指標轉換
編譯器隱式地轉換確定的指標型別,分配、條件表示式使用操作符==
和!=,
函式呼叫使用三種隱式的指標轉換,如下節所描述,三種隱式指標轉換: l
乙個指標物件型別可以隱式地轉換為void
指標,反之亦然; l
乙個給定型別的指標可以隱式地轉換為乙個該型別更合格的版本; l
乙個null
指標常可以隱式地轉換為任意指標型別。
4.2.3.1
指標轉換為void
void
指標為具有void *
型別的指標,通常稱為多用途指標,可以表示任意物件的位址,而不關心它的型別,例如,malloc()
函式返回乙個void
指標,在你使用記憶體塊前,void
指標必須轉換為指向乙個物件的指標。
example 4-1
示範了void
指標的多個用途,程式使用標準函式qsort()
對陣列進行排序,此函式定義在標頭檔案stlib.h
中,其原型如下:
void qsort( void *array, size_t n
, size_t element_size
,
int (*compareqsort())(const void *, const void *) );
以公升序排列陣列元素,以array
位址開始,使用快速排序演算法,假定函式具有n
的元素,其大小為element_size。
第4個引數compare
為qsort()
呼叫的用做排序的函式指標,用來比較的兩個元素的位址通過此函式指標的引數傳入,通常,比較函式由程式定義,其返回值必須大於0
,或小於0
,或等於0,
以表示第乙個元素大於、或小於、或等於第二個元素。
example 4-1. a comparison function for qsort( )
#include
#define arr_len 20
/*
* a function to compare any two float elements,
* for use as a call-back function by qsort( ).
* arguments are passed by pointer.
*
* returns: -1 if the first is less than the second;
* 0 if the elements are equal;
* 1 if the first is greater than the second.
*/
int floatcmp( const void* p1, const void* p2 )
/*
* the main( ) function sorts an array of float.
*/
int main( )在上面的例子中,malloc()
函式返回乙個void *,
接著,在qsort()
中對pnumbers
賦值時被隱式地轉換為float*
,第乙個引數隱式地由float*
轉換為void*,
函式名floatcmp
隱式地解釋為函式指標,最終,當floatcmp()
被qsort()
呼叫時,它接收void*
型別的引數,在初始化float
變數前必須顯式地轉換為float*
型別。
C核心技術手冊(三十一)
4.2.3 隱式指標轉換 編譯器隱式地轉換確定的指標型別,分配 條件表示式使用操作符 和 函式呼叫使用三種隱式的指標轉換,如下節所描述,三種隱式指標轉換 l乙個指標物件型別可以隱式地轉換為 void 指標,反之亦然 l乙個給定型別的指標可以隱式地轉換為乙個該型別更合格的版本 l乙個 null 指標常...
C核心技術手冊(三十一)
4.2.3 隱式指標轉換 編譯器隱式地轉換確定的指標型別,分配 條件表示式使用操作符 和 函式呼叫使用三種隱式的指標轉換,如下節所描述,三種隱式指標轉換 l乙個指標物件型別可以隱式地轉換為 void 指標,反之亦然 l乙個給定型別的指標可以隱式地轉換為乙個該型別更合格的版本 l乙個 null 指標常...
C核心技術手冊(二十一)
浮點常量可被寫為十進位制或十六進製制,在下面兩個小節描述。3.2.1 十進位制浮點常量 乙個普通的浮點常量由乙個十進位制數字包含乙個小數點的序列組成。在科學計數法中,你也可以給它的值乘以10 的冪。10 的冪可以使用指數表示,引入字母e 或e,乙個包含指數的浮點常量不需要包含小數點,table 3 ...