善于运用指针--通过指针引用数组

news2025/1/18 3:43:02

一个数组包含若干个元素,每个元素在内存中占用储存单元,它们都有相应的地址,指针变量能指向变量,也可以指向地址。所谓数组元素的地址,也就是数组元素的指针。

文章目录

  • 前言
  • 一、在引用数组元素时指针的运算
  • 二、通过指针引用数组元素
  • 三、用数组名作函数参数
    • 1用指针打印数组
    • 2.指针-指针
  • 总结


前言

在C语言中,数组名代表数组首元素的地址,于是这两种写法是等价的


一、在引用数组元素时指针的运算

P+1指向同一数组中的下一个元素,P-1指向同一数组中的上一个元素,并不是简单的加一,而是+上一个数组元素的字节数。整型+4,double  占8个字节。

代码如下:

int main()
{
	int i = 0;
	int arr[5] = { 1,2,3,4,5 };
	int* p = arr;//数组名是首元素地址
	for (i = 0; i < 5; i++)
	{

		printf("%p\n", p + i);

	}
	return 0;
}

运行结果:

这里每个地址之间相差4,因为整型变量是4个字节。 


代码如下: 

int main()
{
	int i = 0;
	int arr[5] = { 1,2,3,4,5 };
	int* p = arr;//数组名是首元素的地址
	for (i = 0; i < 5; i++)
	{
		
		printf("%p--->%p\n", p+i,&arr[i]);
		
	}
	return 0;
}

运行结果: 

 

 指针加一,加的是一个元素所占空间的大小,元素名是首元素的地址。

p+i  = arr+i  =  &arr[i] 


二、通过指针引用数组元素


1.用指针打印数组

代码如下(示例):

int main()
{
	int i = 0;
	int arr[5] = { 1,2,3,4,5 };
	int* p = arr;//数组首元素地址
	for (i = 0; i < 5; i++)
	{

		printf("%d\n", *(p + i));
		//printf("%d\n", *(arr + i));
		//printf("%d\n", arr[i]);

	}
	return 0;
}

printf("%d\n", *(p + i));

printf("%d\n", *(arr + i));

printf("%d\n", arr[i]); 

都能打印数组元素,通过下标的方式最直观

通过p++也能打印 ,这种方法更简洁,高效


2.指针-指针

代码如下(示例):

int main()
{
	int i = 0;
	int arr[5] = { 1,2,3,4,5 };
	int* p1 = &arr[0];//数组首元素地址
	int* p2 = &arr[4];
	printf("%d\n", p2 - p1);
	return 0;
}

运行结果: 

如果指针p1和p2指向同一数组中的元素,那么p1-p2得到的是数组的元素个数


三、用数组名作函数参数

“*”是解引用操作符,对指针进行解引用操作,得到的是对应变量所占空间的内容(也就是它的值)

故:

*(p+i)  = *(arr+i)  =  *&arr[i] = arr[i] 得到的是数组的元素

 例:用指针对10个整数按由小到大排序

代码如下:

总结

(未完待续.....)

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

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

相关文章

word poi-tl 图表功能增强,插入图表折线图、柱状图、饼状图

目录 问题解决问题poi-tl介绍 功能实现引入依赖功能介绍 功能实例饼图模版代码效果图 雷达图&#xff08;模版同饼图&#xff09;代码效果图 柱状图&#xff08;模版同饼图&#xff09;代码效果图 附加CustomCharts 工具类CustomChartSingleSeriesRenderData 数据对象CustomCha…

QT数据库SQLite:QsqlTableModel使用总结

数据库连接、数据模型与界面组件所涉及的类之间的关系如下所示&#xff1a; 数据库类 QSqlDatabase 类用于建立与数据库的连接&#xff0c;QSqlDatabase 对象就表示这种连接。QSqlDatabase 类的功能主要分为三大部分&#xff1a; 1、创建数据库连接&#xff0c;即创建 QSqlDat…

[MoeCTF 2022]what are y0u uploading?

[BJDCTF 2020]签个到? 解压后发现两个文件夹&#xff0c;进去发现有个压缩包 这里压缩包打不开&#xff0c;就直接给改成png后缀 发现变成了一个二维码 然后用QR工具扫一下 得到flag NSSCTF{i_am_a_tupian} [MoeCTF 2022]what are y0u uploading&#xff1f; 右击查看源码…

查询品牌涉及两张表(brand、brand_admin_mapping)

文章目录 1、BrandController2、AdminCommonService3、BrandApiService3、BrandCommonService4、BrandSqlService涉及的表SQL 查询逻辑参数处理执行查询完整 SQL 逻辑参数映射总结 SELECT * FROM brand_admin_mapping WHERE admin_id 252SELECT * FROM brand WHERE id 44SELE…

k8s 为什么需要Pod?

Pod&#xff0c;是 Kubernetes 项目中最小的 API 对象&#xff0c;更加专业的说&#xff0c;Pod&#xff0c;是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着&#xff0c;Kubernetes 项目的调度器&#xff0c;是统一按照 Pod 而非容器的资…

如何在Ubuntu中利用repo和git地址下载获取imx6ull的BSP

01-设置git的用户名和邮箱 git config --global user.name "suwenhao" git config --global user.email "2487872782qq.com"这里不设置的话后面在第5步的repo配置中还是会要求输入&#xff0c;而且以后进行相关操作都要输入&#xff0c;不妨现在就进行配置…

【机器学习】基于SVM、逻辑回归和CNN的手写数字识别:性能对比与应用分析

基于SVM、逻辑回归和CNN的手写数字识别&#xff1a;性能对比与应用分析 1 基于SVM对手写数字识别2 基于逻辑回归对手写数字进行识别3 基于CNN对手写数字进行识别总结对比分析 1 基于SVM对手写数字识别 在使用SVM方法对手写数字进行识别的时候&#xff0c;我采用了一对多&#…

Elasticsearch ILM 故障排除:常见问题及修复

作者&#xff1a;来自 Elastic Stef Nestor 大家好&#xff01;我们的 Elasticsearch 团队正在不断改进我们的索引生命周期管理 (index Lifecycle Management - ILM) 功能。当我第一次加入 Elastic Support 时&#xff0c;我通过我们的使用 ILM 实现自动滚动教程快速上手。在帮…

【html网页页面009】html+css制作学校官网主题网页制作含登录(5页面附效果及源码)

校园网站主题网页制作 &#x1f964;1、写在前面&#x1f367;2、涉及知识&#x1f333;3、网页效果&#x1f308;4、网页源码4.1 html4.2 CSS4.3 源码获取w034学校网页源码及介绍链接 &#x1f40b;5、作者寄语 &#x1f964;1、写在前面 学校网站主题的网页 一共5个页面 网…

JavaScript柯里化和组合函数以及严格模式介绍

柯里化介绍 柯里化的结构 简化版本 让函数的职责单一 柯里化的复用 对某些逻辑进行复用 打印日志的柯里化 自动化柯里化函数 实现柯理化函数 1.柯里化函数是对函数进行处理的方法&#xff0c;所以参数就为一个函数&#xff0c;这里取名w为fn 2.定义一个函数curried&#xff0…

查看 tomcat信息 jconsole.exe

Where is the jconsole.exe? location: JDK/bin/jconsole.exe

【SpringBoot】Day11-09 参数配置化

为什么需要参数配置化 对于这些配置信息是直接硬编码&#xff0c;写死在java程序中的&#xff0c;存在几个问题&#xff1a; 如果这些参数发生变化了&#xff0c;就必须在源程序代码中改动这些参数&#xff0c;然后需要重新进行代码的编译&#xff0c;将Java代码编译成class字节…

企业迎接现场网络安全检查准备

企业安全负责人一听到主管单位单位要来现场进行网络安全就紧张可是对于不少重点企业来说&#xff0c;现场检查又是不可避免的&#xff0c;今天就谈谈企业如何准备网络安全检查。 网络安全现场检查类型&#xff1a; 常规检查&#xff1a;年度例行重要信息系统网络安全检查&…

UE5.5 Geometry库平面切割原理分析

平面切割--FMeshPlaneCut 平面定义: 面上一个点 法线 算法流程如下 求几何体所有顶点和面的有向距离(Signs) Sign计算&#xff1a; float Sign (VertexPos - PlaneOrigin).Dot(PlaneNormal); 遍历所有几何体所有交叉边, 进行SplitEdge 对于位于切割面两侧的交叉边(Sign…

VideoConvertor.java ffmpeg.exe

VideoConvertor.java ffmpeg.exe 视频剪切原理 入点 和 出点 选中时间点&#xff0c;导出

react hooks讲解--通俗易懂版

面试必备&#xff01; useState:状态管理 useState有两个状态&#xff0c;一个是status&#xff0c;一个是setStatus setStatus修改数据后&#xff0c;会触发<App/>的re-render 什么是re-render? re-render:重新渲染&#xff0c;re-render并不意味着dom会更新&#x…

MongoDB集群的介绍与搭建

MongoDB集群的介绍与搭建 一.MongoDB集群的介绍 注意&#xff1a;Mongodb是一个比较流行的NoSQL数据库&#xff0c;它的存储方式是文档式存储&#xff0c;并不是Key-Value形式&#xff1b; 1.1集群的优势和特性 MongoDB集群的优势主要体现在以下几个方面&#xff1a; (1)高…

基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发&#xff0c;开发过程中采用了OpenCV框架&#xff0c;Sqlite db 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强…

element Plus中 el-table表头宽度自适应,不换行

在工作中&#xff0c;使用el-table表格进行开发后&#xff0c;遇到了小屏幕显示器上显示表头文字会出现换行展示&#xff0c;比较影响美观&#xff0c;因此需要让表头的宽度变为不换行&#xff0c;且由内容自动撑开。 以下是作为工作记录&#xff0c;用于demo演示教程 先贴个…

GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册

文章目录 GitLab基础环境部署&#xff1a;Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、GitLab安装配置2.1 安装GitLab所需的依赖包2.2 添加GitLab存储库2.2.1 将GitLab存储…