其他分享
首页 > 其他分享> > 指针函数和qsort函数

指针函数和qsort函数

作者:互联网

1、函数指针的形式:
  函数指针:int (*funcP) (int *a, int *b)

  表示定义了一个funcP函数指针,指向了返回值为int类型,参数为int* 和int* 的函数

  使用方式:

#include <stdlib.h>
#include <stdio.h>
int swap(int* num1, int* num2) {
    int temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}
int main()
{
    int (*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)

  使用方式:

  

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int getStrlen(char* str) {
    return strlen(str);
}

int main()
{
    int (*funcP) (char* str);

    char* s = "test";
    funcP = getStrlen;
    int len = funcP(s);
    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 就是一个函数指针,具体使用方式如下:

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

 

 

 

 

 

 

 

文提到了一个段错误的问题,这里特别强调一下段错误
段错误就是指访问的内存超出了系统给这个程序所设定的内存空间,例如,访问了不存在的内存地址,访问了系统保护的内存地址,访问了只读的内存地址等情况,小章节详细记录段错误

标签:funcP,return,函数,int,qsort,char,num1,include,指针
来源: https://www.cnblogs.com/qin6666/p/15460378.html