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

news/2025/2/25 19:19:10

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的对比


http://www.niftyadmin.cn/n/5865873.html

相关文章

JavaWeb-在idea中配置Servlet项目

文章目录 在idea中进行Servlet项目的配置(较新的idea版本)创建一个空的JavaSE项目(Project)创建一个普通的JavaSE板块(module)添加Web项目的配置定义一个对象模拟实现接口在web.xml中配置路径映射配置项目到Tomcat服务器启动Tomcat服务器进行测试 在idea中进行Servlet项目的配置…

Python入门教程丨3.7 数据可视化

我们之前提到了一款可视化神器ECharts&#xff0c;但那是基于JS的来开发和使用的&#xff0c;现在我们有了pyecharts库&#xff0c;就可以在python中方便的调用&#xff01; 1. Pyecharts 库 1.1 什么是 Pyecharts&#xff1f; Pyecharts是 ECharts 的 Python 接口&#xff0…

2025 银行业科技金融创新与发展报告

在数字化浪潮席卷全球的今天,银行业正站在科技金融创新的前沿。2025 年,科技与金融的深度融合将重塑银行业的生态格局,推动金融服务迈向智能化、高效化和普惠化的新阶段。 一、科技金融创新的背景与意义 (一)全球经济数字化转型加速 随着信息技术的飞速发展,全球经济正…

火绒终端安全管理系统V2.0网络防御功能介绍

火绒终端安全管理系统V2.0 【火绒企业版V2.0】网络防御功能包含网络入侵拦截、横向渗透防护、对外攻击检测、僵尸网络防护、Web服务保护、暴破攻击防护、远程登录防护、恶意网址拦截。火绒企业版V2.0的网络防御功能&#xff0c;多层次、多方位&#xff0c;守护用户终端安全。 …

数据结构 1-2 线性表的链式存储-链表

1 原理 顺序表的缺点&#xff1a; 插入和删除移动大量元素数组的大小不好控制占用一大段连续的存储空间&#xff0c;造成很多碎片 链表规避了上述顺序表缺点 逻辑上相邻的两个元素在物理位置上不相邻 头结点 L&#xff1a;头指针 头指针&#xff1a;链表中第一个结点的存储…

【C】初阶数据结构7 -- 树与顺序结构的二叉树(堆)

这篇文章将会介绍一个新的数据结构 -- 树&#xff0c;以及一种特殊的树 -- 二叉树&#xff0c;并用数组来实现二叉树&#xff0c;用数组实现的二叉树也叫做堆。 目录 1 树 1&#xff09; 树的概念 2&#xff09; 树的结构 &#xff08;1&#xff09; 逻辑结构 &#xff0…

【react】进阶教程01

目录 一、性能优化策略 1. 组件渲染优化 2. 虚拟 DOM 优化 3. 代码分割&#xff08;Lazy Loading&#xff09; 二、高级 Hooks 模式 1. 自定义 Hook 2. useReducer 复杂状态管理 三、状态管理进阶 1. Redux Toolkit 现代 Redux 实践 2. 状态选择器优化 四、高级组件模…

【解析】跨网文件安全交换系统:打破网络壁垒,解锁高效传输!

在数字化办公成为主流的当下&#xff0c;企业的网络环境愈发复杂。为了应对日益严峻的网络安全威胁&#xff0c;满足合规性要求&#xff0c;许多企业都选择了将内部网络划分为内网和外网&#xff0c;进行严格的隔离。这种隔离措施就像在企业的信息资产周围筑起了一道坚固的防线…