自学内容网 自学内容网

深入理解指针4

1:回调函数

回调函数就是一个通过函数指针调用的函数。

如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其他所指向的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

2:qsort函数的使用

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void print1(int arr[], int sz)
{
    int* p = arr;
    for ( int j = 0; j < sz; j++)
    {
        printf("%d ", p[j]);
    }
}

struct stu
{
    char name[1314];
    int age;
    char sex[520];
};

void print2(struct stu arr[], int sz)
{
    for (int j = 0; j < sz; j++)
    {
        printf("%s %d %s\n", arr[j].name, arr[j].age, arr[j].sex);
    }
}
int int_cmp(const void* p1, const void* p2)
{
    return *(int*)p1 - *(int*)p2;
}
void test1()
{
    int arr[] = { 2,3,5,7,8,6,9,0,1,4 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(int), int_cmp); //没有头文件
    print1(arr,sz);
}
int cmp_s_age(const void*a1,const void*a2) 
{
    return ((struct stu*)a1)->age - ((struct stu*)a2)->age; 
}
int cmp_s_name(const void*e1,const void*e2)
{
    return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
void test2()
{
    struct stu s[] = { {"xiaomin",19,"boy"},{"xiaohong",18,"girl"},{"xiaogang",24,"boy"} };
    int sz = sizeof(s) / sizeof(s[0]);
    qsort(s, sz, sizeof(s[0]), cmp_s_age);
    print2(s, sz);
    printf("\n");
    qsort(s, sz, sizeof(s[0]), cmp_s_name);
    print2(s, sz);
}

int main()
{
    test1();
    printf("\n");
    test2();
    return 0;
}

上面代给出了整型和结构体使用qsort函数排序,还涉及使用指针对整型和结构体数组的打印。


qsort(数组名,数组个数,数组长度,比较函数);

这个是qsort函数的参数个数,其中最重要的是比较函数的设计。

比较函数的返回值为int,参数为两个const void*的指针;返回值需要强制类型转换,而且需要比较后返回整型。


3:qsort函数的模拟实现,冒泡排序

int int_cmp(const void* p1, const void* p2)
{
    return *(int*)p1 - *(int*)p2;
}
void _swap(void* p1,void* p2,int size)
{
    int i = 0;
    for (i = 0; i < size;i++)
    {
        char tmp = *((char*)p1 + i);
        *((char*)p1 + i) = *((char*)p2 + i);
        *((char*)p2 + i) = tmp;
    }
}
void bubble(void *base,int count,int size,int(*cmp)(void*,void*))
{
    int i = 0, j = 0;
    for (i = 0; i < count - 1; i++)
    {
        for (j = 0; j < count - i - 1; j++)
        {
            if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
            {
                _swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
            }
        }
    }
}

int main()
{
    int arr[] = { 0,8,6,4,3,2,9,7,1,5 };
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int* p = &arr;
    bubble(arr, sz, sizeof(arr[0]), int_cmp);
    for(i = 0; i < sz; i++)
    {
        printf("%d ", p[i]);
    }
    return 0;
}

参照qsort函数,设计函数,遵照qsort(数组名,数组元素个数,数组元素大小,比较函数)的参内容进行设计。

 

 

 

 


原文地址:https://blog.csdn.net/2403_87752060/article/details/143579240

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!