C核心技術手冊(三十一)

2022-03-10 18:16:56 字數 2082 閱讀 3086

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 (*compare

)(const void *, const void *) );

qsort()

以公升序排列陣列元素,以

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.
*/
intfloatcmp( 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 ...