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

嵌入式学习第十三天报告:从void指针深入理解C语言内存与指针

1. void指针:通用内存操作工具

1.1 void指针的基本概念

void指针(void *)是C语言中一种特殊的指针类型,它不指向任何具体的数据类型。void指针的主要特点是:

  • 通用性:可以指向任意类型的数据
  • 灵活性:通过强制类型转换可以访问不同类型的数据
  • 内存操作:主要用于内存地址的存储和传递

1.2 void指针的定义与使用

// void指针的定义void*p=NULL;// 指向不同类型的数据intnum=100;floatfnum=3.14;charch='A';void*vp;vp=#// 指向整型vp=&fnum;// 指向浮点型vp=&ch;// 指向字符型

1.3 void指针的强制类型转换

由于void指针没有具体类型,使用时必须进行强制类型转换:

intnum=100;void*vp=#// 错误:不能直接解引用void指针// *vp = 200;// 正确:先进行类型转换int*ip=(int*)vp;*ip=200;printf("num = %d\n",num);// 输出:200

1.4 void指针的应用场景

1.4.1 通用函数参数
// 通用的内存设置函数voidset_memory(void*ptr,intvalue,size_tsize){unsignedchar*p=(unsignedchar*)ptr;for(size_ti=0;i<size;i++){p[i]=(unsignedchar)value;}}##2.二级指针:指针的指针 ###2.1二级指针的概念 二级指针是指向指针的指针,用于存储指针变量的地址。 ```cintnum=100;int*p=&num;// 一级指针,指向intint**pp=&p;// 二级指针,指向int*printf("num的地址: %p\n",&num);printf("p的值: %p\n",p);printf("pp的值: %p\n",pp);printf("*pp的值: %p\n",*pp);// 等价于pprintf("**pp的值: %d\n",**pp);// 等价于num

2.2 二级指针的应用

2.2.1 修改函数外部的指针
voidallocate_memory(int**ptr,intsize){*ptr=(int*)malloc(size*sizeof(int));if(*ptr!=NULL){for(inti=0;i<size;i++){(*ptr)[i]=i+1;}}}intmain(void){int*array=NULL;allocate_memory(&array,5);// 传递指针的地址if(array!=NULL){for(inti=0;i<5;i++){printf("array[%d] = %d\n",i,array[i]);}free(array);}return0;}
2.2.2 字符串数组操作
voidmodify_string_array(char**str_array,intindex,constchar*new_str){if(str_array!=NULL&&index>=0){// 释放旧字符串free(str_array[index]);// 分配新字符串str_array[index]=(char*)malloc(strlen(new_str)+1);if(str_array[index]!=NULL){strcpy(str_array[index],new_str);}}}

3. 指针数组与数组指针

3.1 指针数组

指针数组是数组,数组的每个元素都是指针。

// 定义指针数组inta=10,b=20,c=30;int*ptr_array[3]={&a,&b,&c};// 访问指针数组元素for(inti=0;i<3;i++){printf("ptr_array[%d] = %p, *ptr_array[%d] = %d\n",i,ptr_array[i],i,*ptr_array[i]);}// 字符串指针数组(常用)char*str_array[]={"Hello","World","Embedded","System"};for(inti=0;i<4;i++){printf("str_array[%d] = %s\n",i,str_array[i]);}

3.2 数组指针

数组指针是指针,指向一个数组。

// 定义数组指针intarr[5]={1,2,3,4,5};int(*p)[5]=&arr;// p是指向包含5个int的数组的指针// 访问数组元素for(inti=0;i<5;i++){printf("(*p)[%d] = %d\n",i,(*p)[i]);// 等价于:printf("arr[%d] = %d\n", i, arr[i]);}// 二维数组与数组指针intmatrix[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int(*p_matrix)[4]=matrix;// 指向包含4个int的数组的指针for(inti=0;i<3;i++){for(intj=0;j<4;j++){printf("%2d ",p_matrix[i][j]);// 等价于matrix[i][j]}printf("\n");}

4. const指针:保护数据不被修改

4.1 const指针的四种形式

intnum=100;intvalue=200;// 1. 指向常量的指针(指针可变,指向的值不可变)constint*p1=&num;// *p1 = 300; // 错误:不能修改指向的值p1=&value;// 正确:可以改变指针的指向// 2. 常量指针(指针不可变,指向的值可变)int*constp2=&num;*p2=300;// 正确:可以修改指向的值// p2 = &value; // 错误:不能改变指针的指向// 3. 指向常量的常量指针(指针和指向的值都不可变)constint*constp3=&num;// *p3 = 300; // 错误:不能修改指向的值// p3 = &value; // 错误:不能改变指针的指向// 4. 等价于第1种intconst*p4=&num;// 等价于 const int *p4
http://www.jsqmd.com/news/1324806/

相关文章:

  • Unity角色透视效果:基于ZTest与双Pass的Shader实现
  • 2026年广州做城市生命线安全工程建设的厂家有哪些?
  • 2026年重庆镀锌加工厂怎么选?本地靠谱厂家推荐与行业观察 - 优质品牌商家
  • 上新:推荐莒县海肠捞饭哪家好 - 品牌推广大师
  • Python+Flask+Vue3构建AI新闻聚合系统实战
  • 住宅 IP 怎么选?iphtml 使用感受
  • 正规的农村饮用水一体化净水设备厂家推荐,2026年口碑优选指南 - 优质品牌商家
  • 高通Persist分区修改工具:安全解绑账户的技术解析
  • 2026年四川外墙岩棉板厂家推荐:五大实力企业客观解析与选择指南 - 优质品牌商家
  • 2026 年更新:屯昌口碑好的不锈钢洗手池供应商推荐,别再乱买厨房台盆了!这玩意儿居然能用十年不脏还好打理?-丰卓不锈钢厨具设备 - 企业推荐管【认证】
  • 构建可信赖AI系统:从公平性、鲁棒性到工程落地的全流程实践
  • FFmpeg视频编辑核心能力与实战技巧详解
  • Unity打包PICO4 APK全攻略:从环境配置到疑难报错解决方案
  • 从聊天工具到任务执行器:ChatGPT 和 Codex 正在重写我们的工作流程
  • 从广州走出的跨境物流“老兵”:鼎环国际的十七年与一套系统的选择
  • TCP与UDP协议对比:核心特性与应用场景解析
  • 怎么投sci
  • 2026 年新消息:源汇热门的绿化草坪平台推荐几家,你家楼下的那片绿玩意儿,藏着能让小区颜值飙升还省电费的秘密?-景盛绿化 - 实业推荐官
  • MATLAB实现分布式能源博弈优化:产消者模型与算法
  • 2026 年还在用的视频去水印方法:免费工具实测与原理拆解 - 免费软件工具方法教程
  • Linux rcp 命令超全解析|远程文件复制用法 + 安全避坑指南
  • 视频号投流工具|参谋智投更新:短视频批量创建+批量支付,效率翻倍
  • 深入解析MIPI CCI协议:从I2C基础到数据流模型与实战调试
  • 2026 年新发布:会昌口碑好的绿色包塑防护网供应商哪个好,工地临边还在用铁丝网?这玩意儿能让你省心不止一倍-允安丝网 - 行业推荐官[官方】--
  • 从AI对话到数字员工:WorkBuddy低代码平台实战指南
  • 区块链领域小巨人企业榜单,零数科技入选重点认定
  • 桌面AI助手横评:OpenClaw、Claude Desktop、Cursor等五款工具深度解析与选型指南
  • Cherno的C++教程:从指针到游戏引擎开发实践
  • Python包管理进阶:掌握pip安装路径指定,解决多项目环境冲突
  • 深圳恶臭监测系统怎么选?2026年行业现状与技术选型指南 - 优质品牌商家