1、函數指針的形式:
函數指針:int (*funcP) (int *a, int *b)
表示定義了一個funcP函數指針,指向了返回值為int類型,參數為int* 和int* 的函數
使用方式:
//代碼實現了兩數的交換
#include <stdlib.h>
#include <stdio.h>
void swap(int* num1, int* num2) {
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int main()
{
void (*funcP) (int* a, int* b);
int num1 = 10;
int num2 = 20;
funcP = swap;
(*funcP)(&num1, &num2);
printf("num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
上述代碼運行結果為:num1 = 20, num1 = 10,實現了兩個值的交換功能。
同理我們可以定義出一個返回值為int類型,形參為char* 的函數指針:
int(*funcP) (char* str)
使用方式:
//本代碼實現了strlen函數
#include <stdio.h>
#include <stdlib.h>
int myStrLen(char* str) {
char* start = str;
char* end = str;
while (*end != '\0') {
end++;
}
return end - start;
}
int main()
{
char* str = "test";
int len = myStrLen(str);
printf("%d\n", len);
return 0;
}
運行結果為:4
2、函數指針的應用之qsort函數:
qsort函數:
qsort(void* base, size_t ntimes, size_t size, int (*compar) (const void*, const void*)
base 是要比較內容的地址;
ntimes 是比較內容的個數,如整形數組a:ntimes = sizeof (a) / sizeof ( a[0])
size 是要比較內容的單個類型的大小,如int:sizeof(int)
compare 就是一個函數指針,具體使用方式如下:
//qsort函數的應用
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//數組排序
int myCompareInt(const void *a, const void *b) {
unsigned int *p1, *p2;
p1 = (unsigned int*)a;//不能是a,因為類型不匹配
p2 = (unsigned int*)b;
// 返回a - b 從小到大,返回b - a 從大到小排序
return (*p2 - *p1);
}
//單字符按照ASSIC碼排序
int myCompareChar(const void * a, const void * b) {
//從小到大排序按照assic
return (strcmp((char*)a, (char*)b));
//從大到小排序按照assic
return(strcmp((char*)b, (char*)a));
}
//知識點:char類型指向的本身就是地址,不能再解引用了,int需要解引用
#define NUM 5
int main()
{
unsigned int an[NUM] = {5,7,8,9,3};
qsort(an, sizeof(an) / sizeof(an[0]), sizeof(an[0]),myCompareInt);
for (int i = 0; i < NUM; i++) {
printf("%d ",an[i]);
}
printf("\n");
char* str1 = "aefdcb";
char str2[] = "aefdcb";
qsort(str2, strlen(str2), sizeof(char), myCompareChar);
printf("%s\n",str2);
int (*funcP) (int* a, int* b);
return 0;
}
文提到了一個段錯誤的問題,這里特別強調一下段錯誤
段錯誤就是指訪問的內存超出了系統給這個程序所設定的內存空間,例如,訪問了不存在的內存地址,訪問了系統保護的內存地址,訪問了只讀的內存地址等情況,小章節詳細記錄段錯誤