C语言:强大的函数指针
生活随笔
收集整理的這篇文章主要介紹了
C语言:强大的函数指针
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
在眾多的高級編程語言中,C語言是最貼近底層的,可以對硬件進行編程可以進行系統級別的開發,這是其他語言無法比擬的,C語言之所以怎么強大主要來源指針,指針是C語言最核心的特性,也是很多初學者學習C語言的一道坎,所以許多其他高級編程語言直接將指針干掉進行包裝以引用的形式而出現,俗話說C生萬物嘛,其他很多高級語言都是從C進化而來的。但是我們學習一定要從難處學,易出用。如果沒有對指針進行深度的掌握,那就不要談掌握C語言了。那么函數指針又是指針中最為強大地方,有了它,我們可以很輕松的進行函數編程,可以將函數作為參數,進行傳遞,可以很輕松的實現回調函數!回調函數的意義和好處這里就不展開了。下面使用函數指針做一些通用的函數實現。
代碼實現功能
今天采用函數指針,來實現對所有一維數組都通用的排序功能、打印功能,用戶需要提供針對元素操作的回調函數也就是函數指針。
函數指針介紹
函數指針是指向函數的指針變量。 因此“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數指針有兩個用途:調用函數和做函數的參數。
代碼具體實現
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <memory.h> typedef struct Person {char name[64];int age; }Person;void fun03_personPrint(void* a) {Person* per = (Person*)a;printf("name:%s,age:%d ", per->name,per->age);return; }int fun03_personCompare(void* a, void* b) {Person* per1 = (Person*)a;Person* per2 = (Person*)b;return per1->age < per2->age;//小于才交換,升序 }void fun03_intPrint(void* a) {int* num = (int*)a;printf("%d ", *num);return; }int fun03_intCompare(void* a, void* b) {int* num1 = (int*)a;int* num2 = (int*)b;return *num1 > *num2;//大于就交換,降序 } /* 功能:實現對所有類型數組的元素進行打印 參數: arr 數組首元素地址 eleSize 數組元素大小,確定元素指針步長 length 數組元素個數 print位打印每個元素的回調函數 */ void fun03_printAllArr(void* arr, int eleSize, int length, void(*print)(void*)) {char* ch = (char*)arr;//強轉為char*讓其步長為1for (size_t i = 0; i < length; i++){print(ch + i*eleSize);}printf("\n"); }/* 功能:實現對所有類型的一維數組進行排序 參數: arr 數組首元素地址 eleSize 數組元素大小,確定元素指針步長 length 數組元素個數 compare 排序規則回調函數 */ void fun03_chooseSortAllArr(void* arr,int eleSize,int length,int(*compare)(void*,void*)) {char* ch = (char*)arr;char* temp = (char*)malloc(eleSize);for (size_t i = 0; i < length-1; i++){int index = i;for (size_t j = i+1; j < length; j++){int result = compare(ch + j*eleSize, ch + index*eleSize);if (result){index = j;}}if (index != i){//交換值memcpy(temp, ch + i*eleSize, eleSize);memcpy(ch + i*eleSize, ch + index*eleSize, eleSize);memcpy(ch + index*eleSize, temp, eleSize);}}if (temp != NULL){free(temp);}temp = NULL;return; } void fun03_testint() {int arr[] = { 1,2,4,8,12,11,6 };printf("排序前:");int len = sizeof(arr) / sizeof(int);fun03_printAllArr(arr, sizeof(int), len, fun03_intPrint);fun03_chooseSortAllArr(arr, sizeof(int), len, fun03_intCompare);printf("排序后:");fun03_printAllArr(arr, sizeof(int), len, fun03_intPrint);return; } void fun03_testperson() {Person arr[] = {{ "Coco",100 },{ "Lay",11 },{ "Lily",21 },{ "John",3 },{ "Neol",6 },};printf("排序前:");int len = sizeof(arr) / sizeof(Person);fun03_printAllArr(arr, sizeof(Person), len, fun03_personPrint);fun03_chooseSortAllArr(arr, sizeof(Person), len, fun03_personCompare);printf("排序后:");fun03_printAllArr(arr, sizeof(Person), len, fun03_personPrint);return; } int main(int argc, char *argv[]) {fun03_testperson();fun03_testint();system("pause") ;return 0; }代碼運行結果
總結
以上是生活随笔為你收集整理的C语言:强大的函数指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收藏 eclipse 最常用的10个快捷
- 下一篇: Ansi与Unicode编码