嵌入式课程day14-C语言指针进阶

目录

10.3指针进阶

10.3.1数组指针

10.3.2指针数组

10.3.3函数指针

10.3.4指针函数

10.3.5函数指针的实际应用案例qsort函数:


10.3指针进阶

10.3.1数组指针

是指针 --- 指向对象的类型是 数组 int [3]

数组指针一般用于指向二维数组里面的一行, --- 行指针,存储行地址

数组指针定义:

数据类型 (* 指针名)[元素个数];

int a[2][4] = {{1,3,4,5},{6,7,8,9}
};// 定义一个数组指针指向 第0行。  int [4]
int (*p)[4];   // 4 或者 8 指针名:p
指针类型:int (*)[4]
指针指向对象类型: int[4]p = a;// 分析:
// p + i  ---- i行的行地址		
// *(p+i) ---- i行0列的  列地址		
// *(p+i)+j ---- i行j列的地址 	// 空间列地址:*(p+i)+j     &a[i][j]
// 空间列名称:*(*(p+i)+j)   a[i][j]int i, j;for (i = 0; i < 2; i++)
{for (j = 0; j < 4; j++){printf ("%d ", *(*(p + i) + j));}printf ("\n");
}注意区分: 二维数组的地址偏移  行地址偏移  列地址的偏移  -- 类型不一样使用就不一样
//#include<stdio.h>
//
//int main(void)
//{
//	int a[2][4] = {
//		{1,3,4,5},
//		{6,7,8,9}
//	};
//	
//	// 定义数组指针指向a[0]
//	int (*p)[4] = a;
//	
//	printf("%p %p\n",&a,&a+1);
//	printf("%p %p\n",p,p+1);              // 行地址
//	printf("%p %p\n",*(p+0),*(p+1));     //  每一行的首列的地址	
//	printf("%p %p\n",*(p+0)+1,*(p+1)+1); // 列地址的偏移	 
//		
//	return 0;
//}

数组指针应用场景:

需要将二维数组传递到函数内部使用。

void test (int (*p)[4], int row, int col)
{int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf ("%d ", *(*(p + i) + j));}printf ("\n");}
}int main ()
{int a[2][4] = {{1,3,4,5},{6,7,8,9}};int r = sizeof (a) / sizeof (a[0]);int c = sizeof (a[0]) / sizeof (a[0][0]);test (a, r, c);   // 实参 是 &a[0] -- 行地址  ---- 形参和实参在类型上要一致,接收行地址用行指针。return 0;
}

总结:    

数组指针 是一个 指针指向 二维数组的一行, 一般用于将一个二维数组传入到函数内部的时候用,形参设计成数组指针。

10.3.2指针数组

是数组 里面存储同种类型的指针。

指针数组定义:

指针类型 数组名[元素个数];

例子:
int a = 10;
int b = 20;// &a  &b  ----  int *// 定义一个数组用来存储 &a &b 
int* arr[2];arr[0] = &a;
arr[1] = &b;int i;
for (i = 0; i < 2; i++)
{printf ("%d ", *(arr[i]));
}

总结:
数组指针:
行指针  -- 指向二维数组的一行 存储行地址

int (*p)[4];  // 4/8

和 二位数组的数组名用法类似
数据地址:* (p + i) + j
数据空间: * (*(p + i) + j)

场景:将二维数组传入到函数内部,形参设计成数组指针。

指针数组:
数组,里面存储同种类型的指针。

int* arr[2];  // 8 / 16

先按照数组[下标] 获取指针元素,在将指针元素按照指针使用。

10.3.3函数指针

是指针,指向对象类型是函数类型

(准备函数、定义函数指针、函数指针指向函数、函数指针定义函数)

函数指针的定义:

函数类型 *指针名;

#include<stdio.h>//test 是个函数,它的参数是函数指针,即p
void test (int (*p)(int, int),int a,int b)
{int res = p(a,b);printf ("%d \n", res);
}int add (int a,int b)
{return a + b;
}
int dis (int a, int b)
{return a - b;
}
int mul (int a, int b)
{return a * b;
}int main ()
{test (mul,6,9);return 0;
}

10.3.4指针函数

是函数,函数的返回值是指针类型,函数返回一个地址。

定义指针函数

指针类型 函数名(形参列表)
{函数体return 地址;
}
指针类型 变量名 = 调用函数(形参列表);

注意:指针函数返回的地址 不能是局部变量的地址

可以返回传入到函数内部的空间外部空间的地址 或者 动态内存申请的地址

错误案例
int *test()
{int n;return &n;
}
返回的地址在调用函数结束之后就被销毁了,还返回有啥用?

10.3.5函数指针的实际应用案例qsort函数:

qsort函数分析

qsort函数C语言编译器函数库自带的排序函数。

qsort 的函数原型是

void qsort(void*base,size_t num,size_t width,int(*compare)(const void*,const void*));      

qsort函数包含在C 标准库 - <stdlib.h>中。

函数原型分析:

void qsort(void*base,size_t num,size_t width,int(*compare)(const void*,const void*));

函数名:qsort

返回值类型:void

形参列表:

void *base , 接收任意类型地址  --- 数组首元素的地址

size_t nitems,  接受整型数据   --- 数组中元素的个数

size_t size, 接受整型数据      --- 数组中每个元素所占字节数

int(*compare)(const void*,const void*)    函数指针 --- 接受函数地址  --- 比较两个元素的函数

函数指针指针名:compare

函数指针指向对象类型: int (const void*,const void *)

返回值 >0 就交换位置

返回值 <0 就                

#include<stdio.h>
#include<stdlib.h>// 返回值 >0 就交换位置 // 从小到大		 
int cmp (const void* a, const void* b)
{return	*((int*)a) - *((int*)b);
}int main (void)
{int a[] = { 3,5,19,5,4,2,79,5,4,6,7,8 };int len = sizeof (a) / sizeof (a[0]);qsort (a, len, sizeof (a[0]), cmp);int i;for (i = 0; i < len; i++){printf ("%d ", a[i]);}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构的时间复杂度和空间复杂度

目录 时间复杂度 空间复杂度 时间复杂度 基本操作的执行次数&#xff0c;为时间复杂度。 我们使用大O的渐进表示法来表示时间复杂度。 怎么使用&#xff1f; 先看例子&#xff1a; 在这个例子中&#xff0c; 基本操作为变量 count 的 加加 操作&#xff0c;并且&#xff0c;执行…

【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost

文章目录 1、XGBoost Algorithm2、Comparison of algorithm implementation between Python code and Sentosa_DSML community edition(1) Data reading and statistical analysis(2)Data preprocessing(3)Model Training and Evaluation(4)Model visualization 3、summarize 1…

Rust Struct 属性初始化

结构体是用户定义的数据类型&#xff0c;其中包含定义特定实例的字段。结构有助于实现更容易理解的抽象概念。本文介绍几种初始化结构体对象的方法&#xff0c;包括常规方法、Default特征、第三方包实现以及构建器模式。 Struct声明与初始化 struct Employee {id: i32,name: …

AI大模型微调:Qwen2大模型微调入门实战(完整代码)

简介&#xff1a; 该教程介绍了如何使用Qwen2&#xff0c;一个由阿里云通义实验室研发的开源大语言模型&#xff0c;进行指令微调以实现文本分类。微调是通过在&#xff08;指令&#xff0c;输出&#xff09;数据集上训练来改善LLMs理解人类指令的能力。教程中&#xff0c;使用…

基于Python+Django+Vue3+MySQL实现的前后端分类的商场车辆管理系统

项目名称&#xff1a;基于PythonDjangoVue3MySQL实现的前后端分离商场车辆管理系统 技术栈 开发工具&#xff1a;PyCharm、Visual Studio Code (VSCode)运行环境&#xff1a;Python 3.10、MySQL 8.0、Node.js 18技术框架&#xff1a;Django 5、Vue 3.4、Ant-Design-Vue 4.12 …

C++初阶:类和对象(上)

1. 类的定义 1.1 类的定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{ } 中为类的主体&#xff0c;注意类定义结束后的分号不能省略。类体中的内容为类的成员&#xff1a;类中的变量称为类的属性或成员变量&#xff1b;类中的函数称为类的方法或成员…

ctfshow DSBCTF web部分wp

ctfshow 单身杯 web部分wp web 签到好玩的PHP 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public function __destruct() {$this->d (string)$this->d;$this…

【分布式】万字图文解析——深入七大分布式事务解决方案

分布式事务 分布式事务是指跨多个独立服务或系统的事务管理&#xff0c;以确保这些服务中的数据变更要么全部成功&#xff0c;要么全部回滚&#xff0c;从而保证数据的一致性。在微服务架构和分布式系统中&#xff0c;由于业务逻辑往往会跨多个服务&#xff0c;传统的单体事务…

边缘计算在智能物流中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 边缘计算在智能物流中的应用 边缘计算在智能物流中的应用 边缘计算在智能物流中的应用 引言 边缘计算概述 定义与原理 发展历程 …

Spring Boot框架:电商开发的新趋势

5 系统实现 系统实现部分就是将系统分析&#xff0c;系统设计部分的内容通过编码进行功能实现&#xff0c;以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析&#xff0c;系统设计最主要还是进行功能&#xff0c;系统操作逻辑的设计&#xff0c;也包括…

本地源配置 以及ssh 和 nfs

安装软件的三种方式 apt 仓库 在/etc/apt/sources.list文件下 在线源 离线包 修改离线包 挂载并更新 ssh远程管理 sshd的配置文件 服务器命令行的远程登录方式 远程复制 先在第一台主机上创建文件 使用scp命令复制 sftp ssh的密钥登录 创建rsa密钥 将密钥文件传给另一台主机…

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

【MMIN】缺失模态想象网络用于不确定缺失模态的情绪识别

代码地址&#xff1a;https://github.com/AIM3RUC/MMIN abstract&#xff1a; 在以往的研究中&#xff0c;多模态融合已被证明可以提高情绪识别的性能。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到模态丢失的问题&#xff0c;而哪些模态会丢失是不确定的。这使得…

图像处理实验四(Adaptive Filter)

一、Adaptive Filter简介 自适应滤波器&#xff08;Adaptive Filter&#xff09;是一种能够根据输入信号的统计特性自动调整自身参数以达到最佳滤波效果的滤波器。它广泛应用于信号处理领域&#xff0c;如信道均衡、系统识别、声学回波抵消、生物医学、雷达、波束形成等模块。 …

深入理解AIGC背后的核心算法:GAN、Transformer与Diffusion Models

深入理解AIGC背后的核心算法&#xff1a;GAN、Transformer与Diffusion Models 前言 随着人工智能技术的发展&#xff0c;AIGC&#xff08;AI Generated Content&#xff0c;人工智能生成内容&#xff09;已经不再是科幻电影中的幻想&#xff0c;而成为了现实生活中的一种新兴力…

【STM32】基于SPI协议读写SD,详解!

文章目录 0 前言1 SD卡的种类和简介1.1 SD卡的种类1.2 SD卡的整体结构1.3 SD卡运行机制——指令和响应2 SD卡的通信总线2.1 SDIO2.2 SPI3 硬件连接4 代码实践【重点】4.1 HAL库移植4.2 标准库移植4.3 遇到的问题和解决方案5 扩展阅读0 前言 因为项目需要,使用stm32读写sd卡,这…

Three.js 纹理贴图

1. 纹理贴图 在Three.js中&#xff0c;纹理贴图是一种将二维图像贴到三维物体表面的技术&#xff0c;以增强物体的视觉表现。纹理贴图可以使物体表面更加真实、细腻&#xff0c;为场景增色不少。 在Three.js中&#xff0c;纹理贴图的加载主要通过THREE.TextureLoader类实现。…

ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结

01 背景 我们之前在使用ArcGIS出现导出Excel中文乱码及shp添加字段3个字被截断的情况&#xff0c;我们有以下应对策略&#xff1a; 推荐阅读&#xff1a;ArcGIS导出Excel中文乱码及shp添加字段3个字被截断&#xff1f; 那如果我们使用ArGIS Pro出现上述问题&#xff0c;该如何…

图论-代码随想录刷题记录[JAVA]

文章目录 前言Floyd 算法dijkstra&#xff08;朴素版&#xff09; 前言 新手小白记录第一次刷代码随想录 1.自用 抽取精简的解题思路 方便复盘 2.代码尽量多加注释 3.记录踩坑 4.边刷边记录&#xff0c;更有成就感&#xff01; 5.解题思路绝大部分来自代码随想录 Floyd 算法 【…

anzocapital 昂首资本:外汇机器人趋势判断秘籍

再盲目交易而不借助像 anzocapital 昂首资本所了解的外汇机器人趋势判断方法&#xff0c;投资者在外汇市场将面临亏损的风险&#xff0c;anzocapital 昂首资本深知交易策略的重要性&#xff0c;就像外汇机器人确定趋势方向的方法&#xff0c;对投资者有着非凡的意义。 在外汇交…