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

深入理解指针(3)学习笔记

一、数组名的理解

数组名就是第一个元素的地址,但是有两个特例
(1)、sizeof(arr[]),这里算的是整个数组的长度,单位为字节。
(2)、&arr。这里注意,对整个数组取地址和对数组中一个元素取地址结果是不一样的:
以十个元素的整型数组为例,如果arr+1,跳过的是一个元素的大小,即四个字节;
如果&arr+1,跳过的是整个数组,即40个字节。
其他情况下,都是首元素的地址。

二、使用指针访问数组

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){intarr[10]={0};int*p=arr;inti=0;intn=sizeof(arr)/sizeof(arr[0]);for(i=0;i<n;i++){*p=i+1;p++;//这里记录一个小错误,第一行需要固定p,让p在一个起始位置上依次加。之前写成*(p+i)=i+1,//这在后面p++的时候起点直接跑偏。}for(i=0;i<n;i++){printf("%d ",arr[i]);//这里写成*(p+i)/i[arr]/(arr+i)都可以,但是第二个写法不推荐。}return0;}

三、一维数组传参的本质

voidtest(intarr[10])......intmain(){intarr[10]={1,2,3,4,5,6,7,8,9,10}test(arr);return0;}

像上述代码,下面的arr传到test中时,从数组变成了指针,即数组降级。
此时在test函数中计算数组的长度得到的是指针变量的长度,4或8;所以需要在main函数中先算出数组的长度。
总结:一维数组传参的时候,形参部分可以写成数组也可以写成指针。因为传参时本质上是在传指针。

四、冒泡排序

核心思想:相邻的两个元素相互比较,排序。

voidbubble(intarr[5],intn){inti=0;//确定趟数for(i=0;i<n;i++){intj=0;intflag=1;//标记第i趟是否有序for(j=0;j<n-i-1;j++)//这里注意j的范围,不要越界访问了。{if(arr[j]>arr[j+1]){flag=0;intm=0;m=arr[j];arr[j]=arr[j+1];arr[j+1]=m;}}if(flag==1)//分清楚赋值符号和判断相等的符号break;}}voidprint(intarr[5],intn){inti=0;for(i=0;i<n;i++){printf("%d ",arr[i]);}}intmain(){intarr[5]={3,5,2,4,1};intn=sizeof(arr)/sizeof(arr[0]);bubble(arr,n);print(arr,n);return0;}

自己写的时候出现了两个小错误,判断相等的符号错写成了赋值符号,还有循环的边界写错了造成了越界访问。
注意,上面代码中有一个提高程序效率的小技巧。定义了flag来标记数组是否已经是升序,如果已经是了,直接跳出循环,减少多余的比较步骤。

五、二级指针

intmain(){inta=0;int*p=&a;//一级指针int**pp=&p;//二级指针return0;}
当然,以此类推,int***ppp=&pp,还可以依次写下去 且解引用后,*pp=p。

六、指针数组

简单理解,数组的每个元素都是指针。

七、指针数组模拟二维数组

通过指针数组,可以把多个一维数组联系在一起,即模拟一个二维数组。

intmain(){intarr1[3]={0,1,2};intarr2[3]={1,2,3};intarr3[3]={2,3,4};int*arr[3]={arr1,arr2,arr3};inti=0;intj=0;for(i=0;i<3;i++){for(j=0;j<3;j++){printf("%d ",arr[i][j]);}printf("\n");}return0;}

打印结果:

http://www.jsqmd.com/news/1380002/

相关文章:

  • 机器学习-词向量转换2
  • 2026年衡水市政护栏供应厂挑选攻略 中庭护栏等企业实测盘点 - 小范同学a
  • 2026深圳靠谱国际物流服务商盘点|外贸出海全品类合规物流筛选测评 - 互联网科技品牌测评
  • AI 概念学习之路
  • 怎么筛选上海GEO营销效果好的公司?2026年8月选择维度参考 - 滚动商讯
  • 高并发任务处理系统设计:从状态机、并发控制到可观测性实战
  • 2026年陕西**物流托盘实力厂家指南:从选型到落地全方面解析五家实力厂家 - 品研笔录
  • C语言代码的诗意之美:从斐波那契到函数指针的优雅实践
  • 白平衡K‑线性偏移氛围感保色完整原理
  • C语言atexit函数:程序退出时的资源清理与生命周期管理
  • TVA-World分布式具身智能架构研究
  • 新手小白快速理解——SENet注意力机制
  • Java新手实战:从零构建学生信息管理系统(SIMS)
  • 数学建模竞赛Python速成:NumPy、Pandas、Matplotlib核心实战指南
  • 2026年AI训练素材供应商合作攻略,精选推荐值得信赖的AI训练数据集供应商 - 2027品牌AI展
  • HarmonyOS 7.0 / API 26 LazyForEach 卡顿复现:用构建计数器抓出断点切换后的重复渲染
  • 婚前公证财产需要多少钱?费用明细和办理流程全拆解! - 指上通
  • 恒美智造浮游菌采样器:国产空气微生物采样器采购推荐指南 - 专业仪器测评品牌推荐
  • O型密封圈/密封圈/O型圈/橡胶O型圈/氟胶O型圈/硅胶O型圈厂家哪家好?金维密封科技等广东靠谱密封圈实力厂家参考 - 变量人生001
  • CentOS 7服务器磁盘爆满排查与清理全攻略
  • CGAL参数化:打通Blender与Unity三维工作流的7个实战案例
  • 智能商机管理摆脱主观判断
  • 基于LangChain与LLM的智能体工作流:从自然语言需求到代码自动生成
  • 从官图到量产:模型涂装精度损耗与质量验收指南
  • 2026深圳靠谱国际物流企业测评|工厂跨境卖家出海优选指南 - 互联网科技品牌测评
  • 学历提升机构哪家信得过:需求适配与实用选择要点 - 滚动商讯
  • 一文讲透Transformer 的正余弦位置编码核心原理
  • Ubuntu安装与高效使用tldr:命令行速查手册全攻略
  • 两节点MPP集群搭建操作指南
  • HarmonyOS 7.0 / API 26 DevEco 性能分析实战:首帧之后继续卡顿该看哪些日志