当前位置: 首页 > news >正文

嵌入式C语言编程中经验教训总结(七)指针、指针数组和数组指针

嵌入式C语言编程中经验教训总结(七)指针、指针数组和数组指针

指针

在嵌入式C语言中,数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址。例如

int Buff[100];
int *pBuf = Buff;

其中Buff[100]为一个包含100个元素的数组,pBuf为指向Buff数组的指针,所以
Buff[0] 和*pBuf获取的数据是一样的。同样,我们也可以申请字符数组和指针,例如:

unsigned char DL645Cmd_ReadCommAddr[20]=
{12,0x68,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x68,0x13,0x00,0xDF,0x16}; //读通信地址
其存储了电力抄表系统常用的读通信地址的645命令,我们声明一个指向它的指针:
unsigned char *pCmd = DL645Cmd_ReadCommAddr;
通过下面的循环,就可以依次取出命令字:

for(i=0;i<len;i++)
 {
	     	    //SendDate =	DL645Cmd_ReadCommAddr[i];   //方式1
	     	    SendDate =	*pCmd(i);     			//方式2
	     	    //载波发送部分;
				。。。 。。。
 }

指针数组:

指针数组指的是声明的数组里,各个元素均为指针,例如:简单的定义:

	int *a[10];

我们就声明了一个包含10个int型指针的数组。更复杂的情况下,还以645命令的定义为例:

unsigned char DL645Cmd_ReadCommAddr[20]={0x68,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x68,0x13,0x00,0xDF,0x16};  //读通信地址		
unsigned char DL645Cmd_ReadVoltageA[20]={0x68,0x11,0x11,0x11,0x11,0x11,0x11,0x68,0x11,0x04,0x33,0x34,0x34,0x35,0x1B,0x16};  //读A相电压
unsigned char DL645Cmd_ReadVoltageB[20]={0x68,0x11,0x11,0x11,0x11,0x11,0x11,0x68,0x11,0x04,0x33,0x35,0x34,0x35,0x1C,0x16};  //读A相电压			
unsigned char DL645Cmd_ReadVoltageC[20]={0x68,0x11,0x11,0x11,0x11,0x11,0x11,0x68,0x11,0x04,0x33,0x36,0x34,0x35,0x1D,0x16};  //读C相电压

这样的命令大概有好几百条,怎么能统一管理昵?我们就可以声明一个指针数组:

unsigned char *DL645Cmd[] ={DL645Cmd_ReadCommAddr,DL645Cmd_ReadVoltageA,DL645Cmd_ReadVoltageB,DL645Cmd_ReadVoltageC};

这样,每一条命令作为指针数组DL645Cmd的一个元素,不仅方便了后续的扩展和调整,由于不同指令长度不同,使用指针数组还避免了使用二维数组时的大量数据空间浪费。

数组指针

数组指针是指一个指向数组的指针,其重点在于它是一个指针,只不过是指向了一个数组,和执行变量的指针相比,通过对数组指针的移动,可以遍历整个数据,而执行变量的指针往往没有这个需求;
数组指针的定义如下:

	int (*pData)[10]; 其中,由于[]的优先级高于*,所以必须添加(*p).

说明:括号中的*表明 pData 是一个指针,在32位系统下,任何类型的指针所占内存大小都为4个字节,它指向的数组有10个元素,声明完成后,指针指向该数组的首地址.在本文的第一节中,

int *pBuf = Buff;

pBuf即为数组指针。

相关文章:

  • 表哥月薪22k+,而我还在混日子……
  • 【饭谈】在学习测开网课之前,你的心脏需要武装一下
  • Jetson Agx Xavier平台ov5693 glass-to-glass 延时测试
  • C++ 命名类型转换
  • 【定制项目】【M15 消防安全宣传】【横屏版】主要模块:视频 + 音频 + 图标 + 问答游戏
  • 在 Linux 中使用 tcp 转储命令来分析网络
  • 结合viewBinding实现RecyclerView组件的滚动列表显示
  • 【C++】STL——stack和queue(万字详解)
  • Kunyu安装使用教程(linux)
  • 34岁本科男,做了5年功能测试想转行,除了进厂还能干什么?
  • 数据库--mysql(SQL语句)
  • 论文分享 | SpeechFormer: 利用语音信号的层次化特性提升Transformer在认知性语音信号处理领域中的性能
  • JavaEE之CSSⅠ(前端)
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • 中国海底电缆行业发展前景及投资风险预测分析报告
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 《剑指offer》分解让复杂问题更简单
  • 2017 年终总结 —— 在路上
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android单元测试 - 几个重要问题
  • C# 免费离线人脸识别 2.0 Demo
  • Linux Process Manage
  • linux安装openssl、swoole等扩展的具体步骤
  • miaov-React 最佳入门
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • vue-router的history模式发布配置
  • 从输入URL到页面加载发生了什么
  • 读懂package.json -- 依赖管理
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 为什么要用IPython/Jupyter?
  • 从如何停掉 Promise 链说起
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​学习一下,什么是预包装食品?​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)Android开发优化---------UI优化
  • (42)STM32——LCD显示屏实验笔记
  • (Matlab)使用竞争神经网络实现数据聚类
  • (二)linux使用docker容器运行mysql
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (力扣)1314.矩阵区域和
  • (一)RocketMQ初步认识
  • (转)winform之ListView
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net 反编译_.net反编译的相关问题
  • .net 简单实现MD5
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET构架之我见
  • .net和php怎么连接,php和apache之间如何连接
  • .Net环境下的缓存技术介绍