C语言之指针的奥秘(二)

news2024/9/17 8:46:27

一、数组名的理解

int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=&arr[0];
这里使用  &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,而且是数组首元素的地址。如下:

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

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

#include <stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", sizeof(arr));
	return 0;
}

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

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

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

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

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

这里我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1 相差4个字节,是因为&arr[0] 和 arr 都是首元素的地址,+1就是跳过一个元素。但是&arr 和 &arr+1相差40个字节,这就是因为&arr是数组的地址,+1 操作是跳过整个数组的。

二、使用指针访问数组

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

指针的加减运算,方便我们获得每一个元素的地址

#include<stdio.h>
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++)
	{
		//输入
		scanf("%d", p + i);//p+i == &arr[i]
	}
	//输出10个值
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

数组名arr是数组首元素的地址,可以赋值给p,数组名arr和p这里是等价的。

p[i]等价于*(p+i),arr[i]等价于*(arr+i),数组元素在访问编译器处理的时候,也是转换成首元素的地址 +偏移量求出元素的地址,然后解引用来访问。

1.数组就是数组,是一块连续的空间(数组的大小和数组元素类型都有关系)

2.指针(变量)就是指针(变量),是一个变量(4/8个字节)

3.数组名是地址,是首元素的地址

4.可以使用指针来访问数组

拓展: 

三、一维数组传参的本质

我们之前都是在函数外部计算数组的元素个数,那我们可以把函数传给一个函数后,函数内部求元素个数吗?

我们发现在函数内部没有正确获得数组的元素个数。 

这就要学习数组传参的本质了,上篇文章写道:数组名是数组⾸元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参本质上传递的是数组首元素的地址。

所以函数形参的部分理论上应该 使用指针变量来接收首元素的地址 。那么在函数内部我们写
sizeof(arr) 计算的是⼀个地址的大小(单位字节)而不是数组的大小(单位字节)。正是因为 函数的参数部分是本质是指针 ,所以在函数内部是没办法求的数组元素个数的。

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

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

结论:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。本质上是指针变量 。

四、二级指针 

指针变量是变量,是变量就有地址,那指针变量的地址存放在哪里呢?这就是二级指针

int**就是二级指针:

*pp通过对pp中的地址解引用,这样找到的是p,*pp其实访问的就是p;

**pp先通过*pp找到p,然后对p进行解引用操作,找到的就是a。

 

五、指针数组

整型数组是存放整型的数组,字符数组是存放字符的数组,那么,指针数组是存放指针的数组

 

指针数组的每个元素是地址,又可以指向一块区域。

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

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	int* parr[3] = { arr1,arr2,arr3 };
	//打印数组
	int i = 1;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 画图演示:

*(arr1+j)==arr1[j]

*(*(arr+i)+j)==arr[i][j]

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素。
上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的。

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

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

相关文章

电影购票小程序论文(设计)开题报告

一、课题的背景和意义 随着互联网技术的不断发展&#xff0c;人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题&#xff0c;而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用&#xff0c;它能够让用户随时随地…

电气工程VR虚拟仿真实训平台以趣味化方式增强吸引力

在工业4.0时代和教育信息化的双重推动下&#xff0c;我们致力于推动实训课件的跨界合作与共创。VR实训课件不仅促进了不同领域、不同行业之间的紧密合作&#xff0c;更让学习变得生动直观。我们凭借3D技术生动、直观、形象的特点&#xff0c;开发了大量配套3D教材&#xff0c;让…

vue-router history 模式下将所有资源文件js/css/img都存放在oss 利用 cdn 访问整体思路汇总

背景 我们有一个域名https://example.com&#xff0c;但是ssl证书很贵&#xff0c;搞子域名来承接新站点有点费钱&#xff0c;所以我们想用一个目录https://example.com/admin/ 来作为管理后台的站点&#xff0c;这个站点是单页面应用&#xff0c;我又想让其用history router的…

C++入门到进阶(图文详解,持续更新中)

C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 目录 C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 数据 数据类型 基本数据类型/内置数据类型 C常用运算符 赋值运算符 关系运算符 逻辑运算符 杂项运算符 数据的本地化…

VBA即用型代码手册:删除完全空白的行

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

Hadoop的HA模式搭建

准备三台虚拟机 bigdata007&#xff0c;bigdata008&#xff0c;bigdata009 1.前置工作 1.修改虚拟机的IP地址和hostname 2.配置集群中的ip映射&#xff08;/etc/hosts&#xff09; 192.168.111.57 bigdata007 192.168.111.58 bigdata008 192.168.111.59 bigdata0093.关闭虚拟…

千万慎投!自引率高达93%!这16本On hold正处于高危状态,无法检索,剔除岌岌可危中!近四年镇压期刊“出狱”情况一览

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • CCF推荐&#xff0c;4.5-5.0&#xff08;2天见刊&#xff09; • 生物医学制药类&#xff08;2天逢投必中&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09…

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

thinkphp 生成邀请推广二维码,保存到服务器并接口返回给前端

根据每个人生成自己的二维码图片,接口返回二维码图片地址 生成在服务器的二维码图片 控制器 public function createUserQRcode(){$uid = input(uid);if

【VUE进阶】安装使用Element Plus组件

Element Plus组件 安装引入组件使用Layout 布局button按钮行内表单菜单 安装 包管理安装 # 选择一个你喜欢的包管理器# NPM $ npm install element-plus --save# Yarn $ yarn add element-plus# pnpm $ pnpm install element-plus浏览器直接引入 例如 <head><!-- I…

万字总结XGBoost原理、核心参数以及调优思路(上篇)

万字总结XGBoost原理、核心参数以及调优思路&#xff08;上篇&#xff09; 在数据科学领域&#xff0c;XGBoost以其卓越的性能和灵活性&#xff0c;成为了众多机器学习算法中的佼佼者。作为一种梯度提升框架&#xff0c;XGBoost通过构建决策树的集合来最小化一个可微分的损失函…

简洁易用,快速制作高品质产品册的工具

在数字化时代&#xff0c;高效制作高品质产品册的需求日益增长。市场上涌现出众多声称能够帮助快速制作产品册的工具&#xff0c;但真正能兼顾简洁易用和品质的却寥寥无几。 ​这款工具名为“FLBOOK”&#xff0c;它凭借其强大的功能和简单易用的操作界面&#xff0c;赢得了众多…

深入理解FFmpeg--libavformat接口使用(一)

libavformat&#xff08;lavf&#xff09;是一个用于处理各种媒体容器格式的库。它的主要两个目的是去复用&#xff08;即将媒体文件拆分为组件流&#xff09;和复用的反向过程&#xff08;以指定的容器格式写入提供的数据&#xff09;。它还有一个I/O模块&#xff0c;支持多种…

自动化回复信息工具的开发分享!

在当今信息爆炸的时代&#xff0c;无论是个人还是企业&#xff0c;都面临着大量的信息处理和回复工作&#xff0c;为了提高效率&#xff0c;自动化回复信息工具变得越来越重要。 本文旨在分享一个简单但实用的自动化回复信息工具的五段源代码开发过程&#xff0c;帮助读者理解…

Datawhale 2024 年 AI 夏令营第二期——电力需求预测挑战赛

#AI夏令营 #Datawhale #夏令营 1.赛事简介 随着全球经济的快速发展和城市化进程的加速&#xff0c;电力系统面临着越来越大的挑战。电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。 2.赛事任务 给定多个房屋对应电力消耗历史N天的相关…

水库水电站泄洪预警系统解决方案

一、方案背景 水电站建立的初衷有两个&#xff0c;一是用于发电&#xff0c;二是用于调节水量&#xff0c;解决下游洪涝灾害。水电站在丰水期蓄水、枯水期泄洪&#xff0c;泄洪时产生的水流又急又大&#xff0c;对电站大坝及下游存在巨大危险。为了加强水电站工程安全管理&…

对比H100与4090:两者谁才是更好的GPU算力选择?

在进行深度学习和人工智能的应用时&#xff0c;挑选最合适的硬件工具对于模型的训练和推断任务显得尤为关键。尤其在大模型的训练上&#xff0c;英伟达4090或许并不是最合适的选项。进行训练任务时&#xff0c;通常要求有更大的显示存储容量、更宽的内存带宽以及更出色的计算性…

浅说背包问题(上)

背包问题 什么是背包问题背包的分类01背包思路一思路二思路三&#xff08;重头戏&#xff09;常规代码空间优化 例题讲解[NOIP2001 普及组] 装箱问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 最大约数和题目描述输入格式输出格式样例 #1样例输入 #1样例…

商品分类左右联动

1、先看效果 2、以hooks方法处理&#xff0c;方便复制使用&#xff0c;见代码 Good.vue文件 <script setup lang"ts" name"goods">import {onMounted, ref, nextTick} from "vue";import useProductScroll from "/utils/hooks/useP…

halcon序列化机制

可以结合halcon算子的.net程序进行面向对象的编程&#xff1a; 源码如下&#xff1a; 打开算子的.net程序&#xff1a; 将程序运用到C#中&#xff1a; halcondonet.dll源码解读 halcon与C#联合编程的demo halcon的序列化机制 采用二进制进行序列化保存和反序列化 步骤&#…