指针的进阶 下

简介: 指针的进阶

6.函数指针数组


数组是存放相同类型元素的储存空间,函数指针数组,元素的类型便是函数指针


int(*arr[5])(int,int)
数组arr[5],元素类型是int(*)(int,int)


b46ce3b87449bf07d37c0d6eac8a33d3_ad9dd480726244cd8478efada4e3bda6.png


函数指针数组实现——>转移表


#include<stdio.h>
void menu()
{
  printf("*********************\n");
  printf("*** 1.Add  2.Sub ****\n");
  printf("*** 3.Mul  4.Div ****\n");
  printf("***** 0.exit  *******\n");
  printf("*********************\n");
}
int Add(int x, int y)
{
  return x + y;
}
int Sub(int x, int y)
{
  return x - y;
}
int Mul(int x, int y)
{
  return x * y;
}
int Div(int x, int y)
{
  return x / y;
}
int main()
{
  int input = 0;
  int x = 0;
  int y = 0;
  int ret = 0;
  //函数指针数组 
  int(*pfarr[5])(int, int) = { 0,Add,Sub,Mul,Div };
  do
  {
  menu();
  printf("请选择>");
  scanf("%d", &input);
  if (input == 0)
  {
    printf("退出计算器\n");
  }
  else if (input >= 1 && input <= 4)
  {
    printf("请输入两个操作数>");
    scanf("%d%d", &x, &y);
    int ret = pfarr[input](x, y);
    printf("%d\n", ret);
  }
  else
  {
    printf("选择错误,请重新选择\n");
  }
  } while (input);
  return 0;
}


55b8b342be28f43403e7e7191ee42dcd_dbad40a2c04d4d65803caf575becde2d.png


7.回调函数


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


介绍 qsort 函数的使用

qsort函数可以排序任意类型的数据


void qsort(void*base,//待排序的数据的起始位置
           size_t num,//待排序的数据的元素个数
        size_t width,//待排序的数据的元素大小(单位字节)
           int(*cmp)(const void*e1,const void*e2)//函数指针-比较函数
           )


aa5d423761b3ee6826e331f52fb7a4c2_df691900f087456e9d6c7bd59f7125fa.png


void*是无具体类型的指针,可以接受任意类型的地址
void*是无具体类型的指针,不能进行解引用操作,也加减整数


qsort函数实现冒泡排序


#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
  return *(int*)e1 - *(int*)e2;
}
int main()
{
  int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  qsort(arr, sz, sizeof(arr[0]), cmp_int);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  return 0;
}


8fdf68b1995e104857ba12e1b2239523_0d4adbe7f4ec4a0faf39bd948436bce0.png


模拟qsort函数实现冒泡排序


#include<stdio.h>
int cmp_int(const void* e1, const void* e2)
{
  return *(int*)e1 - *(int*)e2;
}
void Swap(char* p1, char* p2, int width)
{
  int i = 0;
  for (i = 0; i < width; i++)
  {
  char tmp = *p1;
  *p1 = *p2;
  *p2 = tmp;
  p1++;
  p2++;
  }
}
void qsort_int(void* base, int sz, int width, int(*pf)(const void* e1, const void* e2))
{
  int i = 0;//确定排序的趟数
  for (i = 0; i < sz-1; i++)
  {
  int j = 0;//每趟排序中需要比对的次数
  int flag = 1;//假设数组已是升序
  for (j = 0; j < sz - 1 - i; j++)
  {
    if (cmp_int((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
    {
    Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);//交换顺序
    flag = 0;
    }
  }
  if (flag == 1)
  {
    break;
  }
  }
}
int main()
{
  int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  qsort_int(arr, sz, sizeof(arr[0]), cmp_int);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  return 0;
}

23f061b00d8bc69cff75f6a9ab02a83a_13376ae6dc654894b7da03287b494ceb.png


目录
相关文章
|
6月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
6月前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
6月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
6月前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)
|
6月前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
6月前
|
搜索推荐
指针进阶(2)
指针进阶(2)
50 4
|
6月前
指针进阶(3)
指针进阶(3)
43 1
|
6月前
|
C++
指针进阶(1)
指针进阶(1)
46 1
|
6月前
|
存储 安全 编译器
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
50 2
|
6月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
50 0