深度解析指针与数组:探索内存管理的艺术

目录

1.数组名的理解

sizeof(数组名),sizef中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 (整个数组的地址和数组首元素的地址是有区别的)

2.使用指针访问数组

arr[i]==>*(arr+i)等价

数组与指针的联系:

3.一维数组传参的本质

4 .冒泡排序

5.二级指针

解引用

6.指针数组

指针数组是数组还是指针?

7.指针数组模拟二维数组


 1.数组名的理解


我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名就是数组首元素(第一个元素)的地址。

 数组名如果是数组首元素的地址,那下面的代码怎么理解呢?

输出的结果是:40,如果arr是数组首元素的地址,那输出应该的应该是4/8才对。

其实数组名就是数组首元素(第一个元素)的地址是对的,但是有两个例外:

sizeof(数组名),sizef中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 (整个数组的地址和数组首元素的地址是有区别的)

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

 图解:

2.使用指针访问数组

为什么访问数组的时候可以使用指针呢?

1.数组在内存中是连续存放的

2.指针+-整数运算,方便我们获得每一个元素的地址

int main()
{int arr[10] = { 0 };//使用指针来访问数组int sz = sizeof(arr) / sizeof(arr[0]);//输入10个值int* p = arr;int i = 0;for (i = 0; i < sz; i++){//输入1个值scanf("%d", p+i);//p+i == &arr[i]}//输出10个值for (i = 0; i < sz; i++){printf("%d ", i[arr]);//p[i]  arr[i]  *(arr+i)}return 0;
}

 arr[i]==>*(arr+i)等价

1.数组就是数组,是一块连续的空间(数组的大小和数组元素个数和元素类型都有关系)
2.指针(变量)就是指针(变量),是!一个变量(4/8个字节)

数组与指针的联系:

3.数组名是地址,是首元素的地址
4.可是使用指针来访问数组

3.一维数组传参的本质

 打印的值为1,是指针变量的大小,不是数组的大小

数组传参的时候,形参是可以写成数组的形式的
但是本质上还是指针变量void Print(int arr[10])//int* arr
{int sz = sizeof(arr) / sizeof(arr[0]);//得不到元素个数的,算出来的是指针变量的大小int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}void Print(int* p,int sz) //应该是指针
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", *(p + i));}
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);Print(arr, sz);//arr 数组名就是数组首元素的地址//sizeof(arr)//&arrreturn 0;
}

1. 数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参的数组是同一个数组的。

2.形参的数组是不会单独再创建数组空间的,所以形参的数组是可以省略掉数组大小的。

总结:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

4 .冒泡排序

 冒泡排序的核心思想:就是两两相邻的元素进行比较。

 图示:

代码如下

升序
void bubble_sort(int arr[], int sz)
{int i = 0;//趟数for (i = 0; i < sz - 1; i++){//假设已经有序了int flag = 1;//一趟排序的过程int j = 0;for (j = 0; j < sz-1-i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;}}if (flag == 1){break;}}
}void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//排序int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);//打印print_arr(arr, sz);return 0;
}

 

 避免已经排序结束了,但是还在循环

 

 5.二级指针

int main()
{int a = 10;int* p = &a;//p就是一级指针int * * pp = &p;int** * ppp = &pp;int**** pppp = &ppp;//.....return 0;
}

 

 

 解引用

6.指针数组

指针数组是数组还是指针?

是数组!
eg:好孩子,主语是孩子

我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。
那指针数组呢?是存放指针的数组。

 

7.指针数组模拟二维数组

 并不是真的二维数组,只是模拟出来的 

 图解:

parr[]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的素。

上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的。

希望对你有帮助!加油各位!!

每一次努力都是不凡的历练,每一点进步都是值得庆祝的胜利。你正在创造属于自己的辉煌,相信自己,一切皆有可能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UE】如何让组件渲染在post之后

UE组件中的构造函数中设置这个值 bUseEditorCompositingtrue; 看了BillboardComponent的实现之后 BillboardComponent::UBillboardComponent(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { //这句话非常重要 bUseEditorCompositing true;…

R语言【taxlist】——tv2taxlist():从Turboveg数据库导入物种列表

Package taxlist version 0.2.4 Description 将Turboveg 2数据库中的物种列表导入到taxlist对象中。 在内部调用函数read.dbf()和df2taxlist()。 Usage tv2taxlist(taxlist, tv_home tv.home(), ...) Arguments 参数【taxlist】&#xff1a;在Turboveg中指示物种列表名称的…

CSS之定位

定位在CSS当中是一个比较重要的点&#xff0c;接下来&#xff0c;让我为大家介绍一下定位吧&#xff01; 属性描述position-relative相对定位position-absolute绝对定位position-fixed固定定位position-sticky粘性定位position-static静态定位 一、相对定位 给元素设置 posi…

BF16与FP16的区别

参考 BF16 与 FP16 在模型上哪个精度更高呢BF16 与 FP16 在模型上哪个精度更高呢【bf16更适合深度学习计算&#xff0c;精度更高】&#xff1a; 两者差异图示如下&#xff1a; BF16 是对FP32单精度浮点数截断数据&#xff0c;即用8bit 表示指数&#xff0c;7bit 表示小数。…

使用 FHEW-like 自举 BV-like

参考文献&#xff1a; [CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion between (ring) LWE ciphertexts[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2021: 460-479.[K…

Linux——磁盘和文件系统(一)

Linux——磁盘和文件系统 磁盘机械式磁盘固态硬盘 机械式磁盘结构磁盘&#xff0c;磁道&#xff0c;扇区柱面 文件系统的初始化划卷&#xff08;划盘&#xff09; 挂载C盘放了什么东西Boot Block&#xff08;启动模块&#xff09; 0号组放了什么东西Super Block&#xff08;超级…

Python爬取猫眼电影专业评分数据中的应用案例

在数据分析和可视化展示中&#xff0c;获取准确的电影专业评分数据至关重要。猫眼电影作为中国领先的电影信息与票务平台&#xff0c;其专业评分对于电影行业和影迷的数据来说具有重要意义。通过Python爬虫技术&#xff0c;我们可以实现从猫眼电影网站上自动获取这些数据目标。…

面试经典 150 题 ---- 删除排序数组中的重复项 II

面试经典 150 题 ---- 删除排序数组中的重复项 II [删除排序数组中的重复项 II](https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150)方法一&#xff1a;双指针 删除排序数组中的重复项 II …

每日OJ题_算法_前缀和③_力扣724. 寻找数组的中心下标(LCR012+力扣1991)

目录 力扣724. 寻找数组的中心下标 解析代码 力扣724. 寻找数组的中心下标 724. 寻找数组的中心下标 LCR 012. 寻找数组的中心下标 1991. 找到数组的中间位置&#xff08;三道一样的题&#xff0c;一鱼三吃&#xff09; 难度 简单 给你一个整数数组 nums &#xff0c;请…

shell脚本基础之循环语句

目录 一、循环语句的概念 二、for循环语句 1、列表循环 2、列表for循环案例大全 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例八 3、不带列表循环 4、类似C语言风格的for循环 5、for循环总结 三、while循环语句 1、while循环语句格式 2、while死循…

GMS测试BTSfail-CVE-2022-20451

描述&#xff1a; 项目需要过GMS兼容性测试&#xff0c;BTS这块我们环境没有&#xff0c;送检之后出现了一个BTS的Alert&#xff0c;这个是必须要解决的。下面的warning可以不考虑。 这个是patch问题&#xff0c;根据代理提供的pdf文件找到一个id:为A-235098883的补丁&#xf…

利用ChatGPT实现副业赚钱的10个方法

现今ChatGPT的热潮越来越高&#xff0c;很多程序员也把目光转向了如何靠ChatGPT赚钱&#xff0c;而那些掌握先机的程序员已经通过这一副业赚到了人生中的第一桶金。 如果你也对ChatGPT感兴趣&#xff0c;但还没有找到程序员靠ChatGPT实现营收&#xff0c;增加副业收入的方法&a…

洛谷B3625迷宫寻路

迷宫寻路 题目描述 机器猫被困在一个矩形迷宫里。 迷宫可以视为一个 n m n\times m nm 矩阵&#xff0c;每个位置要么是空地&#xff0c;要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。 机器猫初始时位于 ( 1 , 1 ) (1, 1) (1,1) 的位置&#xff0c;问能否…

web渗透测试-Server2225-(环境+解析)

1、访问目标IP,打开第1题,根据页面提示,将获取的flag提交。提交格式:flag{xxx}(提交花括号里面的字段) 给出了如上代码,很明显,flag在flag.php文件内。 REQUEST方法既可以接受GET方法,也可以接受POST方法,方便起见,我们选择GET方法。 eval函数 eval() 函数把字符串…

电商平台低价乱价?电商平台API接口接入,实时获取商品价格

​和传统线下渠道对比线上电商运营手段多样和方便&#xff0c;电商会经常采用价格策略以吸引消费者&#xff0c;这种灵活而频繁的价格变动对供货商的渠道管理提出了前所未有的挑战&#xff0c;实时监测电商的价格变动对于品牌商和电商平台是非常重要的环节。而促销活动设计和日…

Did We Get Everything Covered? Codeforces Round 921 (Div. 2) 1925C

Problem - C - Codeforces 题目大意&#xff1a;给出一个长度为m的字符串s&#xff0c;问所有长度为n且由字母表中前k个字母组成的字符串是否都是s的子序列&#xff0c;如果不是须给出反例 1<n<26;1<k<26;1<m<1000;所有样例的m之和不超过1e6 思路&#xf…

MySQL事务和锁05

官网地址&#xff1a;MySQL :: MySQL 5.7 Reference Manual :: 13.3.6 SET TRANSACTION Statement 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Mysql5.7参考手册 / ... / 集事务语句 13.3.6设定交易报表 …

当包容结构体遇见灵活的内存管理

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

Python算法题集_和为K的子数组

本文为Python算法题集之一的代码示例 题目560&#xff1a;和为K的子数组 说明&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nu…

Revit2018复现《AUTODESK REVIT二次开发基础教程》代码17

using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LearnTime { //必备写法 [Transaction(Tr…