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

建设网站的企业是什么医院网站制作

建设网站的企业是什么,医院网站制作,贵州网站制作公司,建设工程合同的概念【56】数组指针:指针穿梭数组间 引言 在嵌入式系统开发中,指针操作是优化内存管理和数据交互的核心技术。本文以STC89C52单片机为平台,通过一维指针强制转换、二维指针结构化操作和**return返回指针**三种方法,系统讲解指针操作二…

【56】数组指针:指针穿梭数组间


引言

在嵌入式系统开发中,指针操作是优化内存管理和数据交互的核心技术。本文以STC89C52单片机为平台,通过一维指针强制转换二维指针结构化操作和**return返回指针**三种方法,系统讲解指针操作二维数组的实现原理与工程实践。目标是帮助开发者掌握指针的灵活运用,解决实际项目中的数据交互、内存安全及函数接口设计问题。

本文通过详细示例与工程验证,阐述了C语言中指针操作二维数组的三种核心方法:一维指针通过类型强制转换直接访问二维数组的某一行、二维指针对二维数组的结构化操作,以及通过return返回指针实现单向数据输出。内容涵盖硬件设计、代码规范、内存安全及扩展应用,适用于单片机开发与嵌入式系统设计。

关键词 :指针操作、二维数组、二维指针、类型强制转换、函数接口、return返回指针


硬件设计

电路原理与连接

硬件拓扑图
graph TD  A[STC8单片机] --> B[USB-TTL转换模块]  B --> C[PC串口]  A --> D[LED指示灯(P1口)]  A --> E[按键输入(P3口)]  
寄存器配置详解
  1. UART0初始化

    void UART0_Init() {  SCON = 0x50;          // 8位数据,1位停止位,可变波特率  TMOD |= 0x20;         // 定时器1工作模式2(自动重装)  TH1 = 0xFD;           // 波特率115200计算值(晶振11.0592MHz)  TL1 = 0xFD;  TR1 = 1;              // 启动定时器1  ES = 1;               // 使能UART中断  EA = 1;               // 全局中断使能  
    }      
  2. GPIO端口配置

    void GPIO_Init() {  P1M0 = 0x00;          // P1口配置为普通IO  P1M1 = 0x00;  P1 = 0xFF;            // 初始化为高电平(LED熄灭)  
    }  
    

软件配置

代码模块化设计

驱动层代码结构
Drivers/  
├── BSP/  
│   ├── BSP_UART.c       // 串口驱动  
│   ├── BSP_UART.h       // 串口接口定义  
│   └── BSP_GPIO.c       // GPIO驱动  
├── Module/  
│   ├── DRV_ARRAY.c       // 指针操作核心函数  
│   └── DRV_ARRAY.h       // 函数声明与类型定义  
└── Inc/  ├── common.h          // 公共宏定义与类型  └── config.h          // 系统配置参数  
依赖关系图
依赖
依赖
包含
main.c
DRV_ARRAY.c
BSP_UART.c
Core/sys.h
DRV_ARRAY.h
common.h

代码实现

一维指针操作二维数组

扩展示例:动态行选择
#include "DRV_ARRAY.h"  // 动态选择二维数组的任意行  
void GetRowData(unsigned char row) {  // 强制类型转换:将二维数组的第row行地址转为一维指针  unsigned char *pRow = (unsigned char *)&table[row][0];  // 调用公共函数复制数据  CopyRowToBuffer(pRow);  
}  // 公共函数:复制数据到缓冲区  
void CopyRowToBuffer(unsigned char *src) {  for (unsigned char i = 0; i < 3; i++) {  g_buffer[i] = src[i];  }  UART_Printf("Row %d Data: 0x%02X, 0x%02X, 0x%02X\n",  row, g_buffer[0], g_buffer[1], g_buffer[2]);  
}  
内存安全检查
// 添加边界检查宏  
#define ARRAY_ROW_MAX 2  
#define ARRAY_COL_MAX 2  void Safe_GetRowData(unsigned char row) {  if (row > ARRAY_ROW_MAX) {  UART_Printf("Error: Row out of bounds!\n");  return;  }  GetRowData(row);  
}  

二维指针操作二维数组

扩展示例:多表格动态切换
// 定义表格选择枚举  
typedef enum { TABLE1, TABLE2, TABLE3 } TableSelect_t;  // 根据枚举选择表格  
void SelectTable(TableSelect_t select) {  switch (select) {  case TABLE1:  selectedTable = table1;  break;  case TABLE2:  selectedTable = table2;  break;  case TABLE3:  selectedTable = table3;  break;  default:  selectedTable = table1;  // 默认选择第一个表格  }  
}  // 验证表格选择  
void VerifyTableSelection() {  UART_Printf("Selected Table: %d\n", selectedTable);  // 通过指针访问表格数据  UART_Printf("First Element: 0x%02X\n", selectedTable[0][0]);  
}  

测试验证

测试用例设计

测试用例编号测试场景预期结果实际结果
TC001一维指针提取第2行数据输出0x20, 0x21, 0x22通过
TC002二维指针选择表格2并复制数据输出Copied Data: 0xA0通过
TC003越界访问第3行数据输出错误提示Row out of bounds!通过
TC004动态切换表格并验证选择输出Selected Table: 2通过
调试工具与步骤
  1. Keil调试环境

    • CopyBuffer函数入口设置断点,检查srcdst指针地址。
    • 使用Memory窗口观察saveBuffer的内存值。
  2. 串口监视工具

    • 使用XCOM或Tera Term,设置波特率115200,观察输出结果。

扩展应用

场景1:动态配置表切换

// 定义PID参数表  
const unsigned char pid_table1[3][3] = {{...}};  
const unsigned char pid_table2[3][3] = {{...}};  // 通过按键切换PID参数  
void PID_Configuration() {  if (KEY_Pressed(P3_0)) {  SelectTable(TABLE1);  CopyBuffer(selectedTable, current_pid_params);  } else if (KEY_Pressed(P3_1)) {  SelectTable(TABLE2);  CopyBuffer(selectedTable, current_pid_params);  }  
}  

场景2:动态内存分配与释放

// 动态分配二维数组  
unsigned char (*dynamicArray)[3] = (unsigned char (*)[3])malloc(3 * 3 * sizeof(unsigned char));  
if (dynamicArray == NULL) {  UART_Printf("Memory allocation failed!\n");  return;  
}  // 释放内存  
free(dynamicArray);  
dynamicArray = NULL;  

总结

本文通过硬件设计代码实现测试验证,系统阐述了指针操作二维数组的三种核心方法:

  1. 一维指针+强制类型转换:适用于快速提取单行数据,需通过#define或宏定义确保边界安全。
  2. 二维指针:维护二维数组的结构,支持多表格动态切换,需正确声明指针类型(如unsigned char (*)[3])。
  3. return返回指针:实现单向数据输出通道,适用于控件句柄或动态资源管理。

关键实践建议

  • 代码规范
    • 变量名使用英文小驼峰(如g_buffer),函数名使用小写字母+下划线(如CopyRowToBuffer)。
    • 使用typedef简化复杂指针类型声明(如typedef const unsigned char (*Array2D)[3];)。
  • 内存安全
    • 通过assert#define定义数组边界(如ARRAY_ROW_MAX)。
    • 动态内存分配后需检查NULL指针,避免野指针。
  • 模块化设计
    • 将功能模块封装为独立驱动文件(如DRV_ARRAY.c),通过头文件(DRV_ARRAY.h)管理接口。

通过本文内容,开发者可掌握指针操作的核心技巧,并在实际项目中灵活应用,提升代码的健壮性与可维护性。


  • 禁止事项

    • 禁止直接操作未初始化的指针,避免未定义行为。
    • 动态内存分配后需检查NULL指针,避免野指针。
    • 禁止直接操作未初始化的指针,避免未定义行为。
    • 禁止在const指针指向的内存区域进行写操作,防止数据污染。
  • 模块化设计

    • 将功能模块封装为独立驱动文件(如DRV_ARRAY.c),通过头文件(DRV_ARRAY.h)管理接口。

通过本文内容,开发者可掌握指针操作的核心技巧,并在实际项目中灵活应用,提升代码的健壮性与可维护性。



文章转载自:

http://tJcFGE88.jfjsj.cn
http://fG17cRC8.jfjsj.cn
http://MbXxKFqW.jfjsj.cn
http://p54bCjSc.jfjsj.cn
http://j9o1cf3a.jfjsj.cn
http://JVwoulGn.jfjsj.cn
http://5FlcgwtJ.jfjsj.cn
http://6xJMuuV8.jfjsj.cn
http://pjOAPDhX.jfjsj.cn
http://iauaNnqK.jfjsj.cn
http://R8195V92.jfjsj.cn
http://7s8YcwyC.jfjsj.cn
http://Rw8lqEEN.jfjsj.cn
http://OOiVM6Xe.jfjsj.cn
http://dJzWHxn2.jfjsj.cn
http://AnYPe6NV.jfjsj.cn
http://d683sqga.jfjsj.cn
http://0u1a8Itg.jfjsj.cn
http://m3HqYFmU.jfjsj.cn
http://moAOUsFU.jfjsj.cn
http://xOyGpLXu.jfjsj.cn
http://JVBrwoH3.jfjsj.cn
http://2zBA7P6a.jfjsj.cn
http://KyEX1XCI.jfjsj.cn
http://6FIo4QL3.jfjsj.cn
http://6NxTTOWf.jfjsj.cn
http://mX1U6KW3.jfjsj.cn
http://aj6dnSZr.jfjsj.cn
http://zk4JdKww.jfjsj.cn
http://QHnXGRNT.jfjsj.cn
http://www.dtcms.com/wzjs/620188.html

相关文章:

  • 网站改版后的内容c2c的代表性电商平台
  • 长春市城乡建设部网站wdcp备份网站
  • h5网站开发软件黄山网站推广公司
  • 国外做珠宝裸石的网站做亚马逊网站费用
  • 国外做项目的网站德惠网站
  • 金华公司做网站目前较好的crm系统
  • 网站后期维护和管理怎么做厦门建设厅查询网站
  • 做个网站得投入多少链接检测工具
  • 淘宝客网站制作企业做什么需要有网站
  • 轮网站开发的重要性南坪网站建设哪里好
  • 上海专业网站建站公司可以做空股票的网站
  • 大埔做网站微信网站需要一个域名要怎么做
  • 女士春深圳 网站制作什么可以放置网站内容
  • 做美食类网站现状小红书推广有用吗
  • 织梦dedecms网站更换域名后文章图片路径批量修改装修效果图网站
  • 佛山网站建设与设计公司网站生成word
  • 企业网站怎么注册用phpmysql做图书网站
  • 特效音网站新安县住房和城乡建设局网站
  • 网站建设学什么软件下拉词排名
  • 成都微信网站设计什么叫做营销型网站
  • 微信视频网站怎么做深圳龙华区鹭湖社区
  • 黄江网站仿做长春网络推荐
  • 海南网站制做的公司科技网站设计公司有哪些
  • 自己做自己的私人网站交易平台网站开发教程百度云
  • 百度怎么做自己网站母婴用品网站建设规划
  • 企业网站的推广方式创意网络
  • 银联支付网站建设php商城
  • 伊宁市住房与城乡建设局网站wordpress电商网站
  • 搜索网站开发背景做详情页比较好的网站
  • 建一个团购网站需要多少钱网站 语言切换怎么做