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

相关推荐
奔跑吧邓邓子1 小时前
【Python爬虫(64)】从“听”开始:Python音频爬虫与语音数据处理全解析
开发语言·爬虫·python·音频·语音识别
_nut_1 小时前
手撕跳表/数据结构
java·开发语言·数据结构
小猪咪piggy1 小时前
【数据结构】(12) 反射、枚举、lambda 表达式
java·开发语言·数据结构
web147862107232 小时前
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
java·开发语言·数据库
嵌入式修炼师2 小时前
深入理解 QVectorQString:Qt 中动态数组的强大力量
开发语言·qt
浪子西科2 小时前
【数据结构】(Python)第六章:图
开发语言·数据结构·python
kongba0073 小时前
EIDE搭配cursor编译GD32的项目 需要的一些c_cpp_properties设置 json文件
c语言·开发语言·json
抹除不掉的轻狂丶3 小时前
JVM生产环境问题定位与解决实战(三):揭秘Java飞行记录器(JFR)的强大功能
java·开发语言·jvm
Hello.Reader3 小时前
Rust 中的引用循环与内存泄漏
开发语言·windows·rust
xianwu5433 小时前
反向代理模块kfj
开发语言·网络·数据库·c++·mysql