指针(5)加油吧

指针(5)

拿冒泡排序来举例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1 .qsort

void qsort (
	void* base,//base指向待排序数组的首元素的指针
	size_t num,//base指向数组中元素的个数
	size_t size,//base指向的数组中的一个元素的大小,单位是字节
	int(*cmp)(const void*,const void*)//函数指针,传递函数的地址
	);


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

qsort的头文件是==<stdlib.h>==

测试qsort,来排序整型数据

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int cmp_int(const void* p1, const void* p2)
{
	if (*(int*)p1 > *(int*)p2)
	return 1;
	else if (*(int*)p1 < *(int*)p2)
		return -1;
	else
		return 0;//可以简化为return *(int*)p1-*(int*)p2
}
void test1()
{
	int arr[] = { 3,1,4,2,6,5,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}
int main() {
	test1();
	return 0;
}

补充个小知识:

怎样访问结构体的内容

struct Stu{
    char name [20];
    int age;
}
int main()
{
    struct Stu s{"maya",20};
    printf("%s %d\n",s.name,s.age);
    struct Stu *ps=&s;
    printf("%s %d\n",(*ps).name,(*ps).age);
    printf("%s &d\n",ps->name,ps->age);
    return 0;
}

结构体成员访问操作符:

. 结构体变量.成员名

-> 结构体指针->成员名

测试qsort函数排序结构体数据

struct Stu
{
	char name[20];
	int age;
};//名字是字符串,字符串比较是用strcmp函数的
int  cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);

}
void test2()
{
	struct Stu arr[] = { {"zhangsan",28},{"lisi",40},{"wangwu",12} };
	int len = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, len, sizeof(arr[0]), cmp_stu_by_name);
}
int  cmp_stu_by_age(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->age, ((struct Stu*)p2)->age);

}
void test3()
{
	struct Stu arr[] = { {"zhangsan",28},{"lisi",40},{"wangwu",12} };
	int len = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, len, sizeof(arr[0]), cmp_stu_by_age);
}
int main() {
	test2();
	test3();
	return 0;
}

补充知识:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意点:

qsort默认的顺序是升序排列

怎样实现降序呢

可以调换p1和p2顺序

2 .改造冒泡排序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

swap交换两个元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

详细逻辑分析图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意点:为什么强制类型转换的是char呢,我们知道qsort函数base指向的数组中的一个元素的大小,单位是字节,如果换成int,一次跳过四个字节,力度太大了

这也是一个泛型编程,就是不管什么类型的都能处理

3 .sizeof和strlen对比

sizeof是操作符,不是函数

strlen是函数,求字符串长度,只针对字符串(字符数组),统计的是字符串中==\0==前的个数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

int main()
{
	int arr[] = { 1,2,3,4,5,0};
	//01 00 00 00 02 00 00 00 03 00 00 00 ...
    //00相当于\0,strlen遇到\0就停止计算
	printf("%zd\n", strlen(arr));

	return 0;
}

sizeof和strlen对比总结

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4 .数组和指针笔试题解析

4 .1一维数组

前情回顾:

数组名是数组首元素的地址

两个例外:

sizeof(数组名)

&(数组名)

int a[] = {1,2,3,4};
printf("%zd\n",sizeof(a));//16
//数组名a单独放在sizeof内部,a表示整个数组,计算的是整个数组的大小,单位是字节
printf("%zd\n",sizeof(a+0));//这里的a是数组名表示首元素的地址,a+0还是首元素的地址
//这里sizeof计算的是首元素地址的大小 4/8
printf("%zd\n",sizeof(*a));//4 这里的a是数组名表示首元素的地址,*a 就是首元素,就是a[0]
//*a -- *(a+0) -- a[0]
printf("%zd\n",sizeof(a+1));//这里的a是数组名表示首元素的地址,a+1是第二个元素的地址(&a[1])
//计算的是地址的大小 4/8
printf("%zd\n",sizeof(a[1]));//4
printf("%zd\n",sizeof(&a));//&a - 这里的数组名a表示整个数组,&a是整个数组的地址
//数组的地址也是地址,是地址就是 4/8 个字节的长度",sizeof(&a));
printf("%zd\n",sizeof(*&a));
//1. *&a,这里的*和&抵消了,所以sizeof(*&a) == sizeof(a) 16
//2. &a - 这是数组的地址,类型是:int(*)[4],*&a 访问的就是这个数组
printf("%zd\n",sizeof(&a+1));
//&a是数组的地址,&a+1是跳过整个数组后的那个位置的地址
//&a+1是地址,地址都是4/8个字节
printf("%zd\n",sizeof(&a[0]));//4/8
printf("%zd\n",sizeof(&a[0]+1));//第二个元素的地址 4/8

再来一组(字符数组):

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", sizeof(arr));//6
	printf("%d\n", sizeof(arr + 0));//4/8
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4/8
	printf("%d\n", sizeof(&arr + 1));//4/8
	printf("%d\n", sizeof(&arr[0] + 1));//4/8

	return 0;
}

strlen

#include <string.h>

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%zd\n", strlen(arr));//随机值
	printf("%zd\n", strlen(arr + 0));//随机值
	//printf("%zd\n", strlen(*arr));//arr是数组名表示首元素的地址
	//*arr 是首元素 -- 'a' - 97 ,传递给strlen后,strlen 会认为97就是地址,然后去访问内存
	//err -- 程序崩溃
	//printf("%zd\n", strlen(arr[1]));//'b' -98 //err
	printf("%zd\n", strlen(&arr));//随机值
	printf("%zd\n", strlen(&arr + 1));//随机值
	printf("%zd\n", strlen(&arr[0] + 1));//随机值

	return 0;
}
  • 97 ,传递给strlen后,strlen 会认为97就是地址,然后去访问内存
    //err – 程序崩溃
    //printf(“%zd\n”, strlen(arr[1]));//‘b’ -98 //err
    printf(“%zd\n”, strlen(&arr));//随机值
    printf(“%zd\n”, strlen(&arr + 1));//随机值
    printf(“%zd\n”, strlen(&arr[0] + 1));//随机值

    return 0;
    }


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/616580.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

类加载机制(双亲委派机制)

文章目录 JVM的作用是什么双亲委派机制加载流程 JVM的作用是什么 我们运行Java程序时&#xff0c;要安装JDK&#xff0c;JDK包含JVM&#xff0c;不同环境的JDK都是不同的。 Java 代码在编译后会形成 class 的字节码文件&#xff0c;该字节码文件通过 JVM 解释器&#xff0c;生…

【牛客】SQL206 获取每个部门中当前员工薪水最高的相关信息

1、描述 有一个员工表dept_emp简况如下&#xff1a; 有一个薪水表salaries简况如下&#xff1a; 获取每个部门中当前员工薪水最高的相关信息&#xff0c;给出dept_no, emp_no以及其对应的salary&#xff0c;按照部门编号dept_no升序排列&#xff0c;以上例子输出如下: 2、题目…

7.STL_string(详细)

1. 什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架。 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#x…

校园管理系统,基于 SpringBoot+Vue+MySQL 开发的前后端分离的校园管理系统设计实现

目录 一. 前言 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 院校管理员功能模块 三. 部分代码实现 四. 源码下载 一. 前言 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身…

[240512] x-cmd 发布 v0.3.6: (se,wkp,ddgo...)x( kimi,gemini,gpt...)

目录 x-cmd 发布 v0.3.6新增了 jina 模块新增了 ddgo 模块新增了 se 模块wkp 模块新增了 writer 模块cosmo 模块 x-cmd 发布 v0.3.6 本次版本的最新引入的功能都是目的为了进一步探索 LLM 的使用。 本版本的改进分为两类&#xff1a;资讯类模块&#xff08;Wikipedia&#xf…

十、Redis内存回收策略和机制

1、Redis的内存回收 在Redis中可以设置key的过期时间&#xff0c;以期可以让Redis回收内存&#xff0c;循环使用。在Redis中有4个命令可以设置Key的过期时间。分别为 expire、pexpire、expireat、pexpireat。 1.1、expire expire key ttl&#xff1a;将key的过期时间设置为tt…

web前端之sass中的颜色函数、active按钮激活、hover鼠标悬浮、disabled禁用、scss循环、css

MENU 效果图htmlsassscss编译后的css页面css 效果图 注意查看蓝色按钮。 html <div class"box"><button class"btn type_1">按钮</button><button class"btn type_2">按钮</button><button class"btn ty…

机器学习(1)

目录 1-1.西瓜书 1-2.课程定位 1-3.机器学习 1-4.典型的机器学习过程 1-5.机器学习理论 1-6.基本术语 1-7.归纳偏好 1-8.NFL定理 1-1.西瓜书 建议使用方式 1.初学机器学习的第一本书:通读、速读;细节不懂处略过&#xff0c;了解机器学习的疆域和基本思想&#xff0c;…

龙迅LT8911EXB MIPIDSI/CSI桥接到EDP点屏,支持EDP1.4

龙迅LT8911EXB描述&#xff1a; Lontium LT8911EXB是MIPIDSI/CSI到eDP转换器&#xff0c;单端口MIPI接收器有1个时钟通道和4个数据通道&#xff0c;每个数据通道最大运行2.0Gbps&#xff0c;最大输入带宽为8.0Gbps。转换器解码输入MIPI RGB16/18/24/30/36bpp、YUV422 16/20/24…

显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等概念的区别与联系

在科技日新月异的今天&#xff0c;显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等术语已经成为了科技领域的重要组成部分。本文旨在阐述这些术语之间的区别与联系&#xff0c;帮助您更好地理解它们在技术生态系统中的作用。 一、显卡 显卡&#xff0c;也称为…

旅游推荐管理系统(小组项目)

文章目录 前言 一、项目介绍 1. 项目目的 2. 项目意义 2.1 提升旅游体验 2.2 促进旅游业发展 2.3 数据积累与分析 2.4 提升服务品质 2.5 优化资源配置 二、项目结构 1. 主要使用的技术 1.1 若依&#xff08;Ruoyi&#xff09;框架 1.2 Vue.js框架 1.3 Ajax 1.4 …

vivado仿真readmemb函数相对路径

目前常用的vivado工程的结构如下所示 prj-name|-xxx|-prj.sim|-sim_1|-behav|-modelsim|-tb_prj.do|-xsim|-prj.srcs|-sim_1|-new|-tb_prj.v|-tb_prj_mem.txt一般来说我们创建的testbench文件和新建的txt文件都会放在srcs->sim_1->new这个路径下面&#xff0c;但是我们在…

谷歌最强AI——Gemini免费使用2个月教程,性能抗衡GPT4

谷歌最强AI——Gemini采用的是Ultra 1.0大模型&#xff0c;功能非常强大&#xff0c;媲美GPT-4&#xff01;谷歌用户只需要绑定虚拟卡&#xff0c;就可以免费使用2个月&#xff01; 谷歌昨夜官宣四项AI新进展&#xff01; 1、最大、功能最强的大模型版本Gemini Ultra 1.0全面…

vs2019 - LoadLibrary失败时的排查方法

文章目录 vs2019 - LoadLibrary失败时的排查方法概述笔记用GetLastError()看错误原因隐式调用DLL接口看错误原因总结END vs2019 - LoadLibrary失败时的排查方法 概述 在做从内存载入DLL的实验&#xff0c;发现从内存载入DLL失败。 昨天还是成功的。昨天将工程归档了&#xff…

算法提高之字串变换

算法提高之字串变换 核心思想&#xff1a;双向广搜 双向bfs 建立两个队列 一起bfs到中间态 #include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <unordered_map>using namespace std;const int N 6;int n;…

vue2项目升级到vue3经历分享5

写到第5篇了&#xff0c;解决了很多问题&#xff0c;还有一些需要调整 1 el-input-number指令兼容性调整 下面这个可编辑的表格&#xff0c;全是0&#xff0c;于是需要一个指令&#xff0c;让它自己实现如果是0&#xff0c;就置空&#xff1b;如果是数字就是格式化为千分位&…

【数据结构】图的应用---最小生成树(Prim,Kruskal)、最短路径(BFS,Dijkstra,Floyd)、拓扑排序、关键路径、有向无环图表达式

文章目录 5.图的应用5.1 最小生成树5.1.1 Prim算法5.1.2 Kruskal算法5.1.3 最小生成树代码A.邻接矩阵B.邻接表 5.2 最短路径5.2.1 BFS5.2.2 Dijkstra5.2.3 Floyd5.2.4 三种算法的比较 5.3 有向无环图描述表达式5.4 拓扑排序5.5 关键路径 5.图的应用 5.1 最小生成树 定义 对一个…

Android Studio(AS)使用别人的项目与gradle包并运行项目

一、问题描述 在进行AS开发时&#xff0c;我们可能会使用到别人的项目&#xff0c;但发现别人把项目发给我们后会发现gradle项目同步失败o(≧口≦)o&#xff0c;此时计有三&#xff1a; 1.横行霸道、豪取抢夺&#xff1a;直接空降到项目人那里&#xff0c;强他的电脑占为己有…