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

《重生到现代之从零开始的C语言生活》—— 指针3

数组名的理解

在我们使用&arr[0]的方式拿到了数组第一个元素的地址,但是其实,数组名本来就地址,而且是数组首元素的地址
所以数组名就是数组首元素的地址
但是会有两个例外

  • sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
  • &数组名,这里的数组名表示整个数组,取出的是整个数组的地址

除此之外,任何地方使用数组名,数组名都表示首元素的地址

int arr[10]={1,2,3,4,5,6,7}

arr+1t跳过的就是4个字节,&arr+1跳过的就是40个字节,因为&arr取地址取的是整个数组的地址

使用指针访问数组

#include<stdio.h>
int main()
{int i = 0;int arr[10] = { 1,2,3,4,5,6 };int* p = arr;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz;i++){printf("%d", arr[i]);}return 0;
}

在此代码中,arrp是等价的,那么arr[i]可以访问元素,那么p[i]是否也可以访问数组呢?

#include<stdio.h>
int main()
{int i = 0;int arr[10] = { 1,2,3,4,5,6 };int* p = arr;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d", p[i]);}return 0;
}

事实证明p[i]可以替代arr[i]

其实p[i]可以等价为*(p+i)

可以解释为,首元素的地址+偏移量求出元素的地址,然后解引用来访问

一维数组传参的本质

当我们把数组传递过去的时候,传递的是数组名

void aaa(int arr[])
{
.......
}
int main()
{
......
int arr[]={1,2,3,4,5,6,7,8,9};
aaa(arr);
return 0;
}

这时我们给函数传递的是arr这个数组名,我们知道数组名就是数组首元素的地址,所以本质上数组传参就是数组首元素的地址

既然是地址,那么当然可以用指针变量接收它,所以函数的形参的那一部分当然可以用指针变量代替

二级指针

指针变量也是变量,也有地址,那么指针变量的地址储存在哪里呢?

就是二级指针

int main()
{
int a = 0;
int * aa = &a;
int ** aaa = &aa;//这就是二级指针
return 0;
}

在式子中,*aaa=&aaaaa里储存的是指针变量aa的地址

指针数组

整型数组就是很多整型存放到数组里,字符数组就是很多字符存放到数组里
以此类推,指针数组就是指针存放到数组里
指针数组的每一个元素都是地址,地址又可以指向一个区域

指针数组模拟二维数组

之前有提到过,指针数组就是把指针存放到数组里,指针又能指向一个区域
那么我们可不可以把数组存放到指针里,然后再把指针存放到指针数组
在这里插入图片描述
差不多长这样

int main()
{int arr1[9] = {1,2,3,4,5,6,7,8,9};int arr2[9] = {1,2,3,4,5,6,7,8,9};int * parr[2]={arr1,arr2};return 0 ;
}

parr[i]就是访问parr数组的元素,通过parr[i]找到一维数组后,parr[i][j]就是一维数组中的元素,这样,一个二维数组的效果就做好啦


今天的知识讲解完啦,如果觉得有用可以点一下赞和关注,也可以先收藏以防需要时找不到哦,当然如果作者写的哪里有问题欢迎指出,我们一起进步!!!

祝看到这里的人天天开心哦(笔芯)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 手机运动信息管理系统
  • Oracle(76)如何收集统计信息?
  • 深度解析Python PyInstaller打包EXE的详细教程
  • C#发送邮件功能实现全面指南?有哪些方法?
  • C语言--01基础数据类型
  • 前端使用 Konva 实现可视化设计器(21)- 绘制图形(椭圆)
  • 【设计模式】六大原则-下
  • OpenAI 重回巅峰:ChatGPT-4O 最新模型超越谷歌 Gemini 1.5,多项测试夺冠!
  • C++ | Leetcode C++题解之第355题设计推特
  • QTday04
  • 复现 LET-NET
  • rust api接口开发(以登陆和中间件鉴权为例)
  • 企业高性能web服务器之nginx篇
  • 26-vector arraylist和linkedlist的区别
  • 保研考研机试攻略:第七章——图论(2)
  • 【React系列】如何构建React应用程序
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • css布局,左右固定中间自适应实现
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript异步流程控制的前世今生
  • java中具有继承关系的类及其对象初始化顺序
  • JSDuck 与 AngularJS 融合技巧
  • NSTimer学习笔记
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Redis 懒删除(lazy free)简史
  • session共享问题解决方案
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 第十八天-企业应用架构模式-基本模式
  • 聊聊flink的TableFactory
  • 前嗅ForeSpider教程:创建模板
  • Prometheus VS InfluxDB
  • 阿里云ACE认证学习知识点梳理
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #if 1...#endif
  • (13)Hive调优——动态分区导致的小文件问题
  • (2)MFC+openGL单文档框架glFrame
  • (2)STL算法之元素计数
  • (42)STM32——LCD显示屏实验笔记
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (ZT)薛涌:谈贫说富
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (转) 深度模型优化性能 调参
  • (自用)仿写程序
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .bat批处理(一):@echo off
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .Net程序帮助文档制作