函數指針和qsort函數


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; }

 

文提到了一個段錯誤的問題,這里特別強調一下段錯誤
段錯誤就是指訪問的內存超出了系統給這個程序所設定的內存空間,例如,訪問了不存在的內存地址,訪問了系統保護的內存地址,訪問了只讀的內存地址等情況,小章節詳細記錄段錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM