首页 > 其他分享 >关于指针(4)的期末复习

关于指针(4)的期末复习

时间:2024-09-12 20:20:18浏览次数:3  
标签:arr return 复习 int void 期末 printf sizeof 指针

1. 回调函数是什么?

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

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

#include <stdio.h>
 int add(int a, int b)
 {
 return a + b;
 }
 int sub(int a, int b)
 {
 return a - b;
 }
 int mul(int a, int b)
 {
   return a*b
 }
 int div(int a, int b)
 {
    return a / b;
 }
 void calc(int(*pf)(int, int))
 {
    int ret = 0;
    int x, y;
    printf("输⼊操作数:");
    scanf("%d %d", &x, &y);
    ret = pf(x, y);
    printf("ret = %d\n", ret);
 }
 int main()
 {
    int input = 1;
    do
    {
        
        printf("************************* \n");
        printf("  1:add           2:sub  \n");
        printf("  3:mul           4:div  \n");
        printf("*************************\n");
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            calc(add);
            break;
        case 2:
            calc(sub);
            break;
        case 3:
            calc(mul);
            break;
        case 4:
            calc(div);
            break;
        case 0:  printf("退出程序\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
    return 0;
 }

 这个就是使用回调函数的例子

2. qsort使⽤举例

快速排序算法qsort(默认升序

《stdlib.h》 

使⽤qsort函数排序整型数据

void qsort(void*base, size_t num,size_t size,int(*compar)(conse void*p1,const void*p2))

void*base:指向待排序数组的第一个元素

  size_t num元素个数

size_t size元素大小

int(*compar)(conse void*p1,const void*p2)函数指针指向比较函数

#include <stdio.h>
 //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;
 }

 使⽤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函数的模拟实现

#include <stdio.h>
 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<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[] = { 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;
 }

这个代码复制时请注意23行if后面的cmp改为int_cmp

标签:arr,return,复习,int,void,期末,printf,sizeof,指针
From: https://blog.csdn.net/2402_86688931/article/details/142147446

相关文章

  • 【每日一题】LeetCode 2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)
    【每日一题】LeetCode2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)题目描述给定一个整数数组nums,数组下标从0开始。你需要执行以下操作,直到无法再执行为止:选择两个互不相同且未标记的下标i和j。满足条件2*nums[i]<=nums[j],则标记下标i和j。......
  • C语言深入理解指针六(19)
    文章目录前言一、sizeof&strlensizeofstrlensizeof和strlen的对比二、数组和指针笔试题解析一维数组字符数组二维数组三、指针运算笔试题解析题目1题目2题目3题目4题目5题目6题目7总结前言  本篇都将是练习题,从而让你对指针的理解更上一层楼一、sizeof&s......
  • C++ 指针
    声明int*ipl,*ip2;//ipl和ip2都是指向int型对象的指针doubledp,*dp2;//dp2是指向double型对象的指针,dp是double型对象因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。指针值指针的值(即地址)应属下列4种状态之一:指向一个对象。指向紧邻对象所占空......
  • C++复习day11
    类型转化C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。隐式类型转化:编译器在编译阶段自动进行,能转就转,......
  • C++复习day10
    智能指针为什么需要智能指针?#include<iostream>usingnamespacestd;intdiv(){ inta,b; cin>>a>>b; if(b==0) throwinvalid_argument("除0错误"); returna/b;}voidFunc(){ //1、如果p1这里new抛异常会如何? //2、如果p2这里new抛异常会......
  • 【C语言基础】指针
    1指针与地址,指针变量地址就是内存区中对每个字节的编号。如整型变量a、b、c,整型变量需要4个字节,分配的地址分别为1000、1004、1008。可以通过访问变量的地址来找到所需的变量,我们称变量的地址为变量的“指针”。上例中的1000、1004、1008分别为变量a、b、c的指针。指针变量......
  • 复习排序算法
    备战acm校队第二天。实惨,排序学了好几年了,还是没有熟练,意难平啊。特此打开oi-wiki,从头到尾把排序敲一遍。选择排序比较简单。就是把数组里最大数找出来放到最后,然后再把第二大的找出来放在倒数第二位,依次类推,排序就结束了。注:TMD,Dev-C++原来不能把中文注释在代码,不然拷贝出来......
  • 什么时候使用指针?什么时候使用引用?什么时候应该按值传递
    在平时开发过程中,会遇到传参类型选择的问题。使用引用传值的主要原因:1、调用者可修改函数中的数据值;2、传输过程中,仅传递了引用,提高了函数调用效率;类型    仅读值,不写值读值+写值内置数据类型    值传递(较小内存)指针传递数组指针传递指针传递结构体指针或引......
  • C++最强功能之一指针
    最是人间留不住,朱颜辞镜花辞树。                            ——《蝶恋花·阅尽天涯离别苦》【清】王国维今天我们来说一说这个C++区别其他语言最明显的功能,指针。C++的指针可以说是功能强大,很多游戏的外挂中核......
  • 计算机网络知识点总结--适用于期末考试
    第一章 计算机网络概述1.计算机网络的类别1.1按分布范围分:广域网WAN,城域网MAN,局域网LAN, 个人区域网PAN1.2按使用者分:公用网,专用网1.3按交换技术分:电路交换报文交换分组交换1.4.按拓扑结构分:总线型,星型,环型,网状型1.5.按传输技术分:广播式网络 共享公共通信信......