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

相关推荐
昵称画24 分钟前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
“AI国潮设计-小江”40 分钟前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
传奇开心果编程1 小时前
【Rust入门练中学】第6课:结构体与方法
开发语言·rust·结构体·编程语言理论·结构体方法·编程通用语言
code tsunami1 小时前
【无标题】
开发语言·python
CodeGL2 小时前
10、Python基础之进程和线程
开发语言·python
TechWayfarer3 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
Navigator_Z3 小时前
LeetCode //C - 1301. Number of Paths with Max Score
c语言·算法·leetcode
卡卡~~4 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
qq_406981034 小时前
大白话rust系列09 函数调用两次有什么错?
开发语言·python·rust
学逆向的4 小时前
C 多文件开发
c语言·开发语言·网络安全