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

相关推荐
longxiaozhang636 分钟前
C#运算符重载:让对象也能使用“加减乘除”
开发语言·c#
mounter6251 小时前
GCCRS 突破与 Rust 入核:Linux 工具链的重大变革
linux·开发语言·rust·linux kernel·kernel
Buke..1 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(上):Frida 反调试绕过与 unidbg 调用
java·开发语言·爬虫·python·安卓
abcefg_h2 小时前
MCP 实战指南:如何在项目中使用 Model Context Protocol 及其通信原理
开发语言·后端·golang·mcp
梦痕长情2 小时前
记一次关于AI在数仓中的应用
开发语言·人工智能·python·ai
何以解忧,唯有..2 小时前
Python 线程编程:从入门到实战
开发语言·python
SomeB1oody3 小时前
【RustyML入门】7.2. 深入模型持久化
开发语言·后端·机器学习·rust·教程
yaoxin5211233 小时前
502. Java 反射 - 编写 MessageInterceptor 类
java·开发语言
wuyk5553 小时前
Python零基础入门第五章:元组Tuple(不可变容器详解、列表与元组区别)
开发语言·python