首页 > 其他分享 >认识认识指针(4)

认识认识指针(4)

时间:2024-05-26 20:59:19浏览次数:14  
标签:arr 函数 认识 void int sizeof cmp 指针

1. 回调函数是什么?

回调函数就是⼀个通过函数指针调⽤的函数。

如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。

调⽤函数的逻辑是有差异的,我们可以把调⽤的函数的地址以参数的形式 传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函 数的功能。

2. qsort使⽤举例

2.1 使⽤qsort函数排序整型数据

qosrt函数的使⽤者得实现⼀个⽐较函数

int int_cmp(const void * p1, const void * p2)

{ return (*( int *)p1 - *(int *) p2); }

int main() { int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };

int i = 0; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);

for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)

{ printf( "%d ", arr[i]); } printf("\n"); return 0; }

2.2 使⽤qsort排序结构数据

struct Stu //学⽣

{ char name[20];//名字

int age;//年龄};

//假设按照年龄来⽐较

int cmp_stu_by_age(const void* e1, const void* e2)

{ return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age; }

//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的

//假设按照名字来⽐较

int cmp_stu_by_name(const void* e1, const void* e2)

{ return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); }

//按照年龄来排序

void test2() { struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };

int sz = sizeof(s) / sizeof(s[0]); qsort(s, sz, sizeof(s[0]), cmp_stu_by_age); }

//按照名字来排序

void test3() { struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };

int sz = sizeof(s) / sizeof(s[0]); qsort(s, sz, sizeof(s[0]), cmp_stu_by_name); }

int main() { test2(); test3(); return 0; }

3. qsort函数的模拟实现

使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。

注意:这⾥第⼀次使⽤ void* 的指针,讲解 void* 的作⽤。

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; int j = 0;

for (i = 0; i< count - 1; i++)

{ for (j = 0; j-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[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };

int i = 0; bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);

for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++) { printf( "%d ", arr[i]); } printf("\n"); return 0; }

标签:arr,函数,认识,void,int,sizeof,cmp,指针
From: https://blog.csdn.net/2401_83575662/article/details/139220072

相关文章

  • 【C语言】指针
    一:野指针概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)1、野指针成因(1)指针未初始化(2)指针越界访问(3)指针指向的空间释放2、如何避免野指针(1)指针初始化如果明确知道指针指向哪里就直接赋地址,如果不知道指针应该指向哪里,可以给指针赋值NU......
  • 【MySQL数据库】认识数据库+环境搭建--------Windows系统
    一、认识数据库数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。二、MySQL数据库MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大......
  • C语言之指针详解(2)
    文章目录一、数组名的理解二、使用指针访问数组三、一维数组传参的本质四、二级指针五、指针数组六、指针数组模拟二维数组经过了上一讲的《C语言之指针详解(1)》的学习后,我想大家对于指针已经有了一定程度的了解,这章我们将继续学习C语言。这章主要讲的是数组与指针之......
  • C语言之指针详解(1)
    文章目录一、内存和地址1.内存2.地址3.如何理解编址二、指针变量和地址1.取地址操作符(&)2.指针变量和解引用操作符(*)2.1指针变量2.2如何理解指针类型2.3解引用操作符3.指针变量的大小三、指针变量类型的意义1.指针的解引用2.指针加减整数3.void*指针四、c......
  • 指针的入门
    听课笔记#include<stdio.h>intmain(){ intnum=1; //定义了一个指针变量,指针 //说明 //1:int*表示类型为指针类型 //2:名称ptr,ptr就是一个int*类型 //3:ptr指向了一个int类型的变量的地址 int*ptr=&num; //num的地址是多少 //说明1:如果要输出一个变量的地址,使用......
  • 【C++函数指针】
    voidf(stringname){ cout<<"f()->mynameis:"<<name<<endl;}intmain(){ f("1"); autoi=f; i("2");}鼠标放在i上面可以看到类型,所以还可以这样: void(*j)(string)=f; j("2"); typedefvoid(*m)(st......
  • 深入理解C++智能指针系列(一)
    引言都知道C/C++的最难的就是需要程序员自己管理内存,往往会因为一个简单的逻辑错误导致内存管理异常。通常内存管理过程中会遇到以下问题:内存泄漏:当开发者忘记释放已分配的内存时,就会发生内存泄漏。这种情况在大型项目中非常常见,项目中存在大量动态内存操作时,很容易遗漏......
  • 认识认识指针(2)
    1.数组名的理解数组名和数组⾸元素的地址打印出的结果⼀模⼀样,数组名就是数组⾸元素(第⼀个元素)的地址。其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:•sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字......
  • 初识指针(1)
    1.内存和地址1.1内存把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。计算机中常⻅的单位(补充):⼀个⽐特位可以存储⼀个2进制的位1或者0。1byte=8bit1KB=1024byte1MB=1024KB1GB=1024MB1TB=1024GB1PB=1024TB其中,每个内存单元,相当于⼀个学⽣宿......
  • C++入门(3) 指针和引用的区别|引用的本质|引用小结|inline函数|缺省函数
    一,引用引用和指针的区别1,从语法规则上讲指针变量存储某个实例(变量或者对象)的地址;引用是某个实例的别名程序为指针变量分配内存空间;不为引用分配内存空间指针变量的值可以改变;引用一旦初始化就无法改变指针变量可以为NULL;但是没有空引用指针作为形参需要判断是否为空;引用......