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

嵌入式学习day15

指针部分概总:

C语言指针核心笔记

一、指针基础

1. 指针的本质

指针是存储内存地址的变量,其核心作用是间接操作内存空间(解决函数内无法修改外部变量、动态管理内存等问题)。

2. 指针的定义语法

// 格式:数据类型 * 指针变量名;inta=10;int*p=&a;// *表示定义指针变量,&取变量a的地址赋值给p
  • 数据类型:决定指针解引用时访问的内存大小(如int*解引用访问4字节,char*访问1字节);
  • 指针变量名:存储目标变量的内存地址。

3. 指针的大小

  • 32位系统:所有指针大小为4字节(地址总线32位);
  • 64位系统:所有指针大小为8字节(地址总线64位);
  • 指针大小与指向的数据类型无关,仅与系统位数相关。

4. 指针的访问方式

访问方式语法说明
直接访问a = 20;直接通过变量名操作内存
间接访问*p = 20;通过指针解引用操作内存

解引用*的执行步骤

  1. 取出指针变量中存储的内存地址;
  2. 从该地址偏移sizeof(数据类型)字节定位内存空间;
  3. 操作该内存空间(读/写)。

5. 野指针与NULL

  • 野指针:未初始化的指针(存储随机地址),直接解引用会导致内存非法访问;
  • NULL:定义为#define NULL (void*)0,是无效地址,用于初始化指针避免野指针:
    int*p=NULL;// 合法空指针,解引用前需检查

6. 指针运算符与算术运算

运算符作用
&取地址(变量→地址)
*解引用(地址→变量)

指针算术运算规则

  • p + N/p - N:地址偏移N * sizeof(数据类型)字节;
  • p++/p--:地址逐次偏移1个数据类型大小;
  • p - q:仅同类型指针有效,结果为地址间的元素个数(无p+q/p*q/p/q);
  • 指针比较:基于地址大小(>/</==等),仅同类型指针比较有意义。

二、指针与一维数组

1. 数组名与指针的等价性

数组名本质是数组首元素的地址常量(不可修改),因此:

inta[10]={1,2,3};int*p=a;// 等价于 int *p = &a[0];

2. 指针访问数组元素

  • 指针方式:*(p + i)(访问第i个元素);
  • 下标方式:a[i]
  • 等价关系:a[i] <=> *(a + i) <=> *(i + a) <=> i[a](后两种仅语法合法,无实际意义)。

三、指针与字符串

1. 字符串的两种存储形式

形式示例可修改性内存位置
字符数组char s[] = "hello";可修改
字符串常量char *s = "hello";不可修改只读区

2. const与指针(核心)

语法形式含义
const char *s/char const *s指针指向的内容不可修改(*s只读)
char * const s指针变量本身不可修改(s只读)
const char * const s指针变量+指向的内容均不可修改

应用场景:字符串函数参数用const char*,避免函数内修改输入字符串。

3. 常用字符串函数(手动实现核心逻辑)

函数功能核心逻辑
strlen计算字符串长度(不含’\0’)遍历字符串,直到’\0’,统计字符数
strcpy字符串拷贝遍历src,逐字符拷贝到dest,最后补’\0’
strncpy限定长度拷贝拷贝前n个字符,未拷贝满n则补’\0’
strcat字符串拼接先定位dest的’\0’,再从该位置拷贝src的字符
strcmp字符串比较逐字符比较ASCII值,返回第一个不同字符的差值(0=相等,>0=s1>s2,<0=s1<s2)

四、指针与二维数组

1. 二维数组的内存本质

二维数组是数组的数组(如int a[3][4]是3个int[4]类型的一维数组),内存中连续存储。

2. 数组指针(指向一维数组的指针)

// 定义:数据类型 (*指针变量名)[一维数组长度];inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int(*p)[4]=a;// p指向包含4个int的一维数组

3. 二维数组的指针访问

核心等价关系:a[i][j] <=> *(*(a + i) + j) <=> *(p[i] + j) <=> p[i][j]

4. 字符型二维数组 vs 指针数组

// 1. 字符二维数组(栈内存,可修改)chars1[3][10]={"hello","world","china"};char(*p1)[10]=s1;// 数组指针,指向含10个char的数组// 2. 指针数组(存储字符串常量地址,不可修改字符串内容)char*s2[3]={"hello","world","china"};char**p2=s2;// 二级指针,指向char*类型的指针

五、动态内存分配

1. 核心函数(需包含<stdlib.h>

函数功能示例
malloc分配指定字节的内存(未初始化)int *p = (int*)malloc(10*sizeof(int));
calloc分配n个size字节的内存(初始化为0)int *p = (int*)calloc(10,sizeof(int));
realloc重新分配内存(扩展/缩小)p = (int*)realloc(p, 20*sizeof(int));
free释放动态分配的内存free(p); p = NULL;

2. 注意事项

  • 动态内存分配在堆区,需手动free释放,否则内存泄漏;
  • free后必须将指针置NULL,避免野指针;
  • void*指针需强制类型转换后解引用(如*(int*)p)。

六、函数指针

1. 定义语法

// 格式:返回值类型 (*指针变量名)(参数列表);intadd(inta,intb){returna+b;}int(*pfunc)(int,int)=add;// pfunc指向add函数

2. 核心应用:回调函数

// qsort排序示例(自定义比较函数)intcompar(constvoid*a,constvoid*b){return*(int*)a-*(int*)b;// 升序排序}intarr[]={3,1,2};qsort(arr,3,sizeof(int),compar);

七、特殊场景

1. 返回指针的函数

字符串函数(如strcpy/strcat)返回char*,便于链式调用(如strcat(strcpy(dest, src1), src2))。

2. main函数的参数

intmain(intargc,constchar*argv[]){// argc:命令行参数个数(至少为1,argv[0]是程序名)// argv:字符串数组,存储命令行参数}

八、指针核心总结

  1. 指针的核心是地址操作,解决“间接修改变量、动态管理内存、数组/字符串灵活操作”问题;
  2. 指针使用三要素:明确指针指向谁、指针的目标类型、避免野指针/内存泄漏;
  3. 关键等价关系:数组下标↔指针偏移、二维数组↔数组指针、字符串↔char*;
  4. const修饰指针需区分“修饰内容”还是“修饰指针本身”;
  5. 动态内存必须“申请-使用-释放”闭环,函数指针是回调机制的核心。
http://www.jsqmd.com/news/509512/

相关文章:

  • Argos Translate颠覆解析:3个核心价值实战指南
  • MP4视频修复工具:基于原子结构重建技术的损坏文件恢复方案
  • 破解ZLibrary:反爬实战与对抗策略
  • Unity URP描边渲染完整指南:3步实现专业级屏幕空间轮廓效果
  • 2026年太阳能光伏控制器权威品牌深度评测报告 - 优质品牌商家
  • 在Windows系统中部署CVAT的操作指南
  • 【个人学习||JVM】01JVM五大核心模块解析
  • 终极突破:TimeMixer如何用可分解多尺度混合重新定义时间序列预测 [特殊字符]
  • 终极指南:如何用GB/T 7714-2015 CSL样式彻底解决学术论文参考文献格式问题
  • Templater:Obsidian效率倍增的自动化模板工具全流程指南
  • 毕业论文格式自动化:Paperxie 4000 + 院校模板,重构学术排版新效率
  • CYBER-VISION零号协议处理复杂时序数据:LSTM模型对比与增强
  • 大麦网抢票效率提升解决方案:移动端自动化实战指南
  • java微信小程序的健康食品零食商城积分兑换的设计与实现_
  • 计算机毕业设计springboot世界杯娱乐服务平台 基于SpringBoot的足球赛事互动与球迷社区系统 SpringBoot框架下的全球杯赛信息聚合与球迷服务平台
  • 嵌入式C语言编程规范与防御性工程实践
  • 收藏备用|2026大模型学习全攻略(小白+程序员专属,从入门到精通无坑路线)
  • 深入解析OpenAI Chat Completion中的stream流式处理机制
  • 7个实用方法:UE5-MCP提升AI游戏开发效率
  • 真实感动作生成对比:HY-Motion-1.0 vs 开源模型效果评测
  • 解决navicat链接oracle错误:ORA-28547: connection to server failed, probable Oracle Net admin error
  • AI审核驱动的IACheck:海洋环境监测报告如何在多源数据中实现高质量稳定输出
  • 深度解析 RDMA 技术的里程碑:基于 DMA-BUF 的 P2P 直接访问(GPU Direct RDMA 新姿势)
  • ESP32 TWAI/CAN驱动深度解析与Arduino工程实践
  • SunnyUI控件库实战:用UIPipe控件5分钟打造一个流量监控界面
  • DCT-Net视频处理:实时卡通化视频流
  • 开源工具Synology HDD db:突破群晖NAS硬件兼容性限制实现存储自由选择指南
  • 春联生成模型-中文-base开发实战:IDEA中创建SpringCloud集成项目
  • Ext2Read:3步让你在Windows上轻松读取Linux分区文件
  • 本科毕业论文自救指南:用 Paperxie AI,3 天搞定初稿、排版、降重全流程,告别熬夜焦虑