首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >《彻底理解C语言指针全攻略(6)-- qsort、sizeof和strlen》

《彻底理解C语言指针全攻略(6)-- qsort、sizeof和strlen》

作者头像
小龙报
发布2025-12-15 15:43:07
发布2025-12-15 15:43:07
1680
举报
文章被收录于专栏:C\C++C\C++

《qsort、sizeof和strlen》

🔥小龙报:个人主页 ❄️个人专栏:《C语言》《算法》KelpBar海带Linux智慧屏项目 ✨***永远相信美好的事情即将发生***


前言

继上篇文章后这篇文章将继续为大家分享指针的相关知识,本篇主要是qsort、sizeof和strlen三个知识点,让我们向着更优秀的自己出发go!

一、qsort

1.1引入

qsort函数是C语言中提供的一个排序函数(quick sort),是***基于快速排序算法思想的一种排序算法*** qsort函数的优点: (1)现成的排序算法,学会了直接就可以使用不需要自己实现了。 (2)大部分的情况下效率都是比冒泡排序高的***qsort函数可以排序任意类型的数据*** qsort函数的原型及其参数解析:

代码语言:javascript
复制
 #include<stdlib.h>;  //头文件
void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));

参数说明: (1)void base:指向要排序的数组首元素的指针。由于是 void * 类型,所以可以处理任意类型的数组。 (2)size_t num:数组中元素的个数。size_t 是一种无符号整数类型,通常用于表示大小或计数。 ***(4)size_t size:每个数组元素的大小(以字节为单位)*。这里有这个参数是因为,前面用的void类型,只知道元素个数不知道每个元素多大是不行的。 (5)int (*compar)(const void *, const void *)一个指向比较函数的指针。该比较函数用于比较数组中的两个元素,它接受两个 const void * 类型的参数,返回值为 int 类型: 如果进行升序排序,返回一个正整数。如果两个元素相等,返回0。如果进行降序排序,返回一个负整数。 补充说明一下:默认第一个参数比第二个大;

1.1. qsort使用举例

1.1.1使用qsort函数排序整型数据
代码语言:javascript
复制
#include <stdio.h>

//qosrt函数的使⽤者得实现⼀个⽐较函数
int int_cmp(const void* p1,const void* p2)
{
	return (*((int*)p1) - *((int*)p2));
}

int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };


	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);

	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
		printf("%d ", arr[i]);
	return 0;
}

运行结果:

在这里插入图片描述
在这里插入图片描述
1.1.2使用qsort排序结构数据
代码语言:javascript
复制
#include <stdio.h>

struct Stu //学生
{
	char name[20];  //名字
	int age; //年龄
};


//假设按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的

//假设按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}

//按照名字来排序
void test1()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} ,{"zhuming",48}};
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}

//按照年龄来排序
void test2()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} ,{"zhuming",48} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}

int main()
{
	//test1();
	test2();
	return 0;
}

运行结果: (1)按名字排序

在这里插入图片描述
在这里插入图片描述

(2)按年龄排序

在这里插入图片描述
在这里插入图片描述

1.2. qsort函数的模拟实现(冒泡排序)

代码语言:javascript
复制
#include <stdio.h>

int int_cmp(const void* p1, const void* p2)
{
	return (*((int*)p1) - *((int*)p2));
}

void Swap(void* p1, void* p2, size_t size)
{
	//虽然不知道每个元素的大小具体是多少,但是可以一个一个字节的交换
	for (int i = 0; i < size; i++)
	{
		char temp = *((char*)p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = temp;
	}
}

void bubble(void* base, size_t count, size_t size, int(*cmp)(void*, void*))
{
	//虽然不知道具体元素类型,但是强制转换为char*类型是因为是它的大小是1,再+j*size就可以找到第j个元素了
	for (int i = 0; i < count - 1; i++)
	{
		for (int 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");
}

运行结果:

在这里插入图片描述
在这里插入图片描述

回调函数的过程:

在这里插入图片描述
在这里插入图片描述

二、sizeof和strlen的对比

2.1 sizeof

在学习操作符的时候,我们学习了sizeof ,sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。 注: sizeof 只关注占⽤内存空间的大小,不在乎内存中存放什么数据。 例:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof a);
	printf("%d\n", sizeof(int));
	return 0;
}

运行结果:

在这里插入图片描述
在这里插入图片描述

2.2 strlen

strlen 是C语言库函数,功能是求字符串⻓度。函数原型如下:

代码语言:javascript
复制
 size_t strlen ( const char * str );

:统计的是从strlen 函数的参数str 中这个地址开始向后,\0之前字符中字符的个数。strlen 函数会⼀直向后找\0 字符,直到找到\0为止,所以可能存在越界查找 例:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	char arr1[3] = { 'a', 'b', 'c' };
	char arr2[] = "abc";
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));

	printf("%d\n", sizeof(arr1));
	printf("%d\n", sizeof(arr2));
	return 0;
}

运行结果:

在这里插入图片描述
在这里插入图片描述

2.2 sizeof和 strlen比较

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 《qsort、sizeof和strlen》
  • 前言
  • 一、qsort
    • 1.1引入
    • 1.1. qsort使用举例
      • 1.1.1使用qsort函数排序整型数据
      • 1.1.2使用qsort排序结构数据
    • 1.2. qsort函数的模拟实现(冒泡排序)
  • 二、sizeof和strlen的对比
    • 2.1 sizeof
    • 2.2 strlen
    • 2.2 sizeof和 strlen比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档