程式執行期間,每個函式都會占用一段連續的記憶體空間。而函式名就是該函式所佔記憶體區域的起始位址(也稱為「入口位址」)。我們可以將函式的入口位址賦給乙個指標變數,使該指標變數指向該函式。然後通過指標變數就可以呼叫這個函式。這種指向函式的指標變數稱為「函式指標」。
例項:型別名(
* 指標變數名)
(引數型別1
, 引數型別2,.
..);
c語言快速排序庫函式:uint8_t (
* msg)
(uint32_t, uint16_t)
;
可以對任意型別的陣列進行排序。void
qsort
(void
*base,
int nelem, unsugned int width,
int(
*pfcompare)
(const
void
,const
void*)
);
對陣列排序,需要知道:
陣列起始位址;
陣列元素的個數;
每個元素的大小(由此可以算出每個元素的位址)
base待排序陣列的起始位址
nelem待排序陣列的元素個數
width待排序陣列的每個元素的大小(以位元組為單位)
pfcompare比較函式的的位址
pfcompare函式指標,它指向乙個「比較函式」。
該比較函式應為以下形式:
int 函式名(const void *elem1, const void *elem2);
比較函式是程式設計師自己編寫的。
排序就是乙個不斷比較並交換位置的過程。
qsort函式在執行期間,會通過pfcompare指標呼叫「比較函式」,呼叫時將要比較的兩個元素位址傳給「比較函式」,然後根據「比較函式」返回值判斷兩個元素哪個更應該排在前面。
比較函式編寫規則:
如果 * elem1應該排在 * elem2前面,則函式返回值是負整數;
如果 * elem1和 * elem2哪個排在前面都行,那麼函式返回0;
如果 * elem1應該排在 * elem2後面,則函式返回值是正整數。
輸出結果:#include
#include
intmycompare
(const
void
*elem1,
const
void
*elem2)
#define num 5
intmain()
;qsort
(an, num,
sizeof
(unsigned
int)
, mycompare)
;for
(int i =
0; i < num; i++
)return0;
}
10 11 123 4 8
站在巨人的肩上
北京大學資訊科技學院《程式設計實習》
C 學習筆記 函式指標
1 c 指標函式基礎 函式是有位址的,它表示函式執行的入口。我們知道位址值並沒有用,但是可以將位址值當做實參傳入到其它函式中,這可以在不同的時期呼叫不同的函式。函式指標包括三點 如何獲取函式位址,如何申明函式指標,如何呼叫函式。簡單示例 include double betsy int double...
C 學習筆記 函式指標與指標函式
函式指標 指向函式的指標,首先它是指標變數 同指向乙個整形變數 字元 陣列一樣 其次它指向乙個函式 位址 宣告 函式型別 指標變數名 形參列表 函式型別,指明函式的返回型別,由於 優先順序高於 所以指標變數名外的括號不能少,後面形參列表表示指標變數指向的函式所帶的引數列表。上面相當於用函式指標p,代...
指標與陣列(C 學習筆記 11)
1 定義指向陣列元素的指標 每個陣列元素相當於乙個變數,所以定義指向陣列元素的指標與定義指向變數的指標方法相同。例如 int ia 5 定義包含5個陣列元素的整型陣列ia int pi 定義指向整型變數的指標變數pi pi ia 0 使指標變數pi指向陣列的第0個元素 pi ia 0 pi ia 2...