当前位置: 首页 > news >正文

C语言基本知识------指针(4)

1. 回调函数是什么?

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

如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。


void qsort(void base,//指针,指向第一个待排序数组的第一个元素
           size_t num,//是base指向排序数组的元素个数,
           size_t size,//base指向的待排序数组元素的大小
           int (*copare)(cosnt void *cosnt void *,) ;//函数指针---指向的就是两个元素的比较函数 
实现这个函数如下面代码:
#include <stdio.h>
#include <tdilib.h>
void parr(int arr[], int sz)
{
    for (int i = 0;i < sz;i++)
    {
       primntf("%d ",arr[i]);
    }
}
int cmpm_it(const void *p1,const void *p2)
{
   return *(int*)p1-*(int*)p2;
}
int main()
{
    int arr[] = {9,5,2,4,6,4,8,1};
    int sz=sizeof(arr) / sizeof(arr[0]);
    qsort(arr,sz,sizof(arr[0],cmpm_it);
    parr(arr,sz);
    return 0;
}

2.qsort排序结构体/整型数据:

#include <stdio.h>
#include <stdlib.h>
struct stu
{
    char name[20];
    int age;
};
void parr(int arr[], int sz)
{
    for (int i = 0;i < sz;i++)
    {
        primntf("%d ", arr[i]);
    }
}
//结构体大小用名字大小比较
int cmpm_it_name(const void* p1, const void* p2)
{
    return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name);
}
//结构体大小用年龄大小比较
int cmpm_it_name(const void* p1, const void* p2)
{
    return (((struct stu*)p1)->age, ((struct stu*)p2)->age);
}
int main()
{
    struct stu arr[] = {"zhansn",15,"李四",16};
    int sz = sizoef(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizof(arr[0]), cmpm_it_name);
    parr(arr, sz);
    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;
}

4.sizeof和strlen

1.1 sizeof

我们学习了 sizeof sizeof 计算变量所占内存内存空间⼤⼩的,单位是 字节,如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。

sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。

#inculde <stdio.h>
int main()
{
  int a = 10;
  printf("%d\n", sizeof(a));
  printf("%d\n", sizeof a);
  printf("%d\n", sizeof(int));
 
  return 0;
}

1.2 strlen

strlen 是C语⾔库函数,功能是求字符串⻓度。函数原型如下:
1 size_t strlen ( const char * str );
统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。

1.3 sizeof 和 strlen的对比

相关文章:

  • springboot004网页时装购物系统(源码+数据库+文档)
  • threejs 安装教程
  • 51单片机测试题AI作答测试(DeepSeek Kimi)
  • w~视觉~合集13
  • Sinusoidal、RoPE和可学习嵌入的详细介绍及它们增强位置感知能力的示例
  • 信而泰CCL仿真:解锁AI算力极限,智算中心网络性能跃升之道
  • 可视化报表
  • 括号配对问题 【刷题反思】
  • DeepSeek AI人工智能该如何学习?
  • 解锁DeepSeek,未来为语音直播交友软件源码开发搭建注入新活力
  • 2.24DFS和BFS刷题
  • krpano 实现全景视频展示
  • Day55-【软考】-2022年下半年软考软件设计师综合知识真题-计算机专业英语
  • Python NumPy库使用指南:从入门到精通
  • 调查报告:DLL项目运行时库设置与依赖兼容性分析
  • C++ 继承与运算符重载的简单练习
  • LabVIEW不规则正弦波波峰波谷检测
  • 网站快速收录:如何优化网站图片Alt标签?
  • javascript实现二进制、十进制、十六进制和八进制之间的相互转换
  • 短剧小程序系统源码
  • 调查丨永久基本农田沦为垃圾堆场,整改为何成“纸面工程”?
  • 读懂城市|成都高新区:打造“人尽其才”的“理想之城”
  • 英国警方再逮捕一名涉嫌参与首相住宅纵火案嫌疑人
  • 中央提级巡视后,昆明厅官郭子贞接受审查调查
  • 上交所五方面落实募资新规:强化关键少数责任和股东权利保障
  • 美F-35险被胡塞武装击中,损失增大让行动成“烂尾仗”