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

结构体指针做为输入型参数和返回参数为结构体指针

结构体指针做为输入型参数和返回参数为结构体指针

  • 结构体指针运用
    • C的代码其中的原理在代码中有注释
    • 运行结果:

结构体指针运用

这个是测试笔记。

C的代码其中的原理在代码中有注释

#include<stdio.h>typedefstruct// 创建一个结构体{intdisk;intfile;}SCFILE;SCFILE*open(void)// 创建一个函数,返回值是结构体指针{SCFILE*hdl=NULL;// 创建一个结构体指针 初始化的时候需要 赋值 NULL,避免野指针printf("open star 1=================================\n");hdl=(SCFILE*)malloc(sizeof(SCFILE));// 给指针分配指向的地址printf("hdl value %p\n",hdl);// 直接打印 hdl ,表示该指针的指向的地址 ,即该结构体指针存的值printf("*hdl value %d\n",*hdl);// *p 表示的指针进行解引用 由于结构体的存储特性,直接 *hdl 表示结构体中的第一个元素的值printf("&hdl value %p\n",&hdl);// 表示该结构体指针的地址printf("open 2\n");hdl->disk=10;// 给结构体中的元素赋值printf("open 3\n");hdl->file=20;// 给结构体中的元素赋值printf("open 4\n");printf("*hdl value %d\n",*hdl);// 第一个元素的值printf("hdl value %p\n",hdl);// 结构体指针里指向的地址,即该结构体指针存的值printf("&hdl value %p\n",&hdl);// 该结构体指针的地址printf("open end====================================\n");returnhdl;}// 使用二重指针 // 直接传入指针的地址intfffopen(SCFILE**hdl){*hdl=open();// 这里直接把返回的指针(即地址值)赋值给传入的指针的地址,那么就把传入指针指向的地方改变了printf("4\n");if(hdl==NULL){printf("sAPI_fopen err\r\n");return-1;}printf("5\n");printf("hdl->disk %d\n",(*hdl)->disk);printf("hdl->file %d\n",(*hdl)->file);return0;}intfffopen1(SCFILE*hdl){int*aa=NULL;SCFILE*pHd=(SCFILE*)malloc(sizeof(SCFILE));printf("sizeof(pHd) %d\n",sizeof(pHd));// 可以测出,不管什么类型的指针,其大小都是一样的,我的这里是 4字节,和运行的机器位数有关printf("sizeof(aa) %d\n",sizeof(aa));printf("hdl value %p\n",hdl);// hdl 存储的地址值printf("*hdl value %d\n",*hdl);// hdl 第一个元素的值printf("&hdl addr %p\n",&hdl);// hdl 的地址printf("=====================\n");printf("pHd value %p\n",pHd);// phd 存储的值printf("*hdl value %d\n",*pHd);// pHd 第一个元素的值printf("&pHd addr %p\n",&pHd);// pHd 的地址pHd=hdl;// 把 hdl 中存储的地址值赋值给 pHd 即pHd 指向了那个地址printf("4\n");printf("hdl value %p\n",hdl);// hdl 存储的地址值printf("*hdl value %d\n",*hdl);// hdl 第一个元素的值printf("&hdl addr %p\n",&hdl);// hdl 的地址printf("=====================\n");printf("pHd value %p\n",pHd);// phd 存储的值printf("*hdl value %d\n",*pHd);// pHd 第一个元素的值printf("&pHd addr %p\n",&pHd);// pHd 的地址*pHd=*open();// 把open函数返回的赋值给 pHd ,open返回的是结构体指针 加上* 表示解引用 即把两边的解引用出来赋值给新的,因为新的也指向传入的地址//pHd = open(); //如果写成这种,是无法通过输入型参数把值返回的,因为这样表示返回的指针赋值(即另外一个地址)给另外一个指针,传入的就无法改变printf("5\n");printf("hdl value %p\n",hdl);// hdl 存储的地址值printf("*hdl value %d\n",*hdl);// hdl 第一个元素的值printf("&hdl addr %p\n",&hdl);// hdl 的地址printf("=====================\n");printf("pHd value %p\n",pHd);// phd 存储的值printf("*hdl value %d\n",*pHd);// pHd 第一个元素的值printf("&pHd addr %p\n",&pHd);// pHd 的地址if(hdl==NULL){printf("sAPI_fopen err\r\n");return-1;}printf("6\n");printf("hdl->disk %d\n",pHd->disk);// 由于 pHd 和 hdl 指向的地址是同一块,所以打印出的是一样的printf("hdl->file %d\n",pHd->file);printf("hdl->disk %d\n",hdl->disk);printf("hdl->file %d\n",hdl->file);return0;}voidmain(void){#if0SCFILE*hdl=(SCFILE*)malloc(sizeof(SCFILE));printf("11\n");printf("hdl value %p\n",hdl);// hdl 存储的地址值printf("*hdl value %d\n",*hdl);// hdl 第一个元素的值printf("&hdl addr %p\n",&hdl);// hdl 的地址printf("1111\n");if(fffopen(&hdl)==-1){printf("error");}#elseSCFILE*hdl=(SCFILE*)malloc(sizeof(SCFILE));printf("11\n");printf("hdl value %p\n",hdl);// hdl 存储的地址值printf("*hdl value %d\n",*hdl);// hdl 第一个元素的值printf("&hdl addr %p\n",&hdl);// hdl 的地址printf("1111\n");if(fffopen1(hdl)==-1){printf("error");}#endifprintf("OK\n");printf("hdl->disk %d\n",hdl->disk);printf("hdl->file %d\n",hdl->file);}

运行结果:

http://www.cnnetsun.cn/news/3752223.html

相关文章:

  • Android系统各个版本发布时间
  • 单片机毕业设计-基于 STM32 的环境监测与风扇自动调控系统设计 基于嵌入式的温烟数据采集与声光报警系统实现(013901)
  • PWM与SPWM核心差异解析:从基础占空比控制到正弦波逆变应用
  • Python离线安装第三方库:从原理到实战的完整指南
  • 涡轮增压技术解析:从工作原理到性能提升实战指南
  • 计算机毕业设计之采购系统的设计与实现
  • 【无标题】两三万低成本创业互联网广告项目,正规刚需利润稳,个人团队起步快
  • TabPFN:1秒解决表格数据问题的Transformer基础模型,如何改变传统机器学习工作流?
  • 智能客服升级:GPT-5.6 Terra在高频日常场景的降本增效实测
  • AI 输出只能显示纯文本?TokUI 让大模型边说边画界面
  • 深入理解Java wait()方法:从监视器锁到线程协作的实战解析
  • 终极免费IDM激活指南:3分钟永久解锁高速下载神器
  • 百度网盘提取码自动获取工具:3分钟学会快速破解加密资源
  • 如何实现多协议摄像头流媒体服务器的零延迟传输?go2rtc深度解析
  • Subtitle Edit 5:免费开源字幕编辑器的完整解决方案
  • 二叉树遍历全解析:从递归到莫里斯,算法面试核心考点
  • LibreChat 接入 Ace Data Cloud:一个 Token,把 GPT、Claude、Gemini 等主流模型接进你的私有 AI 工作台
  • 节奏AI的“阿喀琉斯之踵”曝光(独家逆向分析Suno v3.5节拍栈):3类时序坍缩陷阱+2种实时抗抖动补偿架构
  • 【单片机毕业设计】基于 STM32 的手动自动定时三模式路灯装置设计 基于 GL5506 的光照检测与路灯分级控制系统设计(014001)
  • 单片机计算机毕设之基于 STM32 的按键可调阈值称重报警系统设计 基于单片机的仓储货物超重声光提醒装置实现(013701)
  • Scrapy+Redis构建亿级分布式爬虫架构实战
  • 计算机毕业设计之基于SpringBoot的“强身”健身房服务平台
  • 2026最新实测口碑筛选 | 实用英语录音转文字工具选择建议
  • 终极指南:如何免费解锁Wand游戏修改器的专业版功能
  • 一加5T Bootloader解锁与刷机全攻略:从原理到实战
  • AI编程助手双模型架构:Codex规划与DeepSeek执行的成本优化实践
  • Input Leap终极指南:免费开源的多设备键盘鼠标共享方案
  • AI基础设施成本黑洞(GPU利用率<22%、冷存储泄漏、API调用冗余——三重稽查指南)
  • NBTExplorer终极跨平台部署指南:3大系统快速配置完整教程
  • 告别官方限制:Bedrock Launcher 如何让Minecraft基岩版玩家获得自由掌控权