指针和数组--指针和二维数组的关系

news2025/1/16 4:55:52

指针和二维数组的关系

目录

一、二维数组的行地址和列地址

二、通过二维数组的行指针和列指针来引用二维数组元素


一、二维数组的行地址和列地址

        在C语言中,可将一个二维数组看成是由若干个一维数组构成的。例如若有下面的定义: 

 int a[3][4]; 

则,其二维数组的逻辑存储结构如下图所示: 

可通过下图来理解二维数组的行地址和列地址的概念。首先可将二维数组a看成是由a[0]、a[1]、a[2]三个元素组成的一维数组,a是它的数组名,代表其第一个元素a[0]的地址(&a[0])。根据一维数组与指针的关系可知,a+1表示的是首地址所指元素后面的第1个元素地址,即元素a[1]的地址(&a[1])。同理,a+2表示元素a[2]的地址(&a[2])。于时,通过这些地址就可以引用个元素的值了,例如*(a+0)或*a即元素a[0],*(a+1)即为元素a[1],*(a+2)即为元素a[2]。注意:这里所谓的元素事实上仍然是个地址,并非具体的数值。

其次,可将a[0]、a[1]和a[2]三个元素分别看成是由4个整型元素组成的一维数组的数组名。例如,a[0]可以看出是由元素a[0][0]、a[0][1]、a[0][2]和a[0][3]这4个整型元素组成的一维数组的数组名,代表该一维数组的第一个元素a[0][0]的地址(&a[0][0]),a[0]+1则代表元素a[0][1]的地址(&a[0][1])。因此,*(a[0]+0)即为元素a[0][0],*(a[0][1])即为元素a[0][1]。

注意:由于a[0]可以看出是由4个整形元素组成的一位数组的数组名。因此,a[0]+1中的数字1代表的是一个整型元素所占的存储单元的字节数,即二维数组的一列所占的字节数:1×sizeof(int);而a可看成由a[0]、a[1]、a[2]三个元素组成的一维数组的数组名,因此表达式a+1中的数字1代表的是一个含有4个整型元素的一维数组所占的存储单元的字节数,即二维数组的一行所占的字节数:4×sizeof(int)。

        根据上面分析可归纳如下:a[i]即*(a+i)可以看出是一维数组a的下标为i的元素,同时,a[i]即*(a+i)又可看成是由a[i][0]、a[i][1]、a[i][2]和a[i][3]等4个元素组成的一维整型数组的数组名,代表这个一维数组第1个元素a[i][0]的地址(&a[i][0]);而a[i]+j即*(a+i)+j代表这个数组中下标为j的元素的地址,即&a[i][j]。*(a[i]+j)即*(*(a+i)+j)就代表这个地址所指向的元素的值,即a[i][j]。因此,下面4种表示a[i][j]的形式是等价的。

a[i][j]-------*(a[i]+j)---------*(*(a+i)+j)----------(*(a+i))[j]

        如果将二维数组的数组名a看成一个行地址(第0行的地址),则a+i代表二维数组a的第i行的地址,a[i]可看成一个列地址,即第i行第0列的地址。行地址a每次加1,表示指向下一行,而列地址a[i]每次加1,表示指向下一列。

        打个比方,二维数组的行地址好比一个宾馆房间所在的楼层号,二维数组的列地址好比一个宾馆房间所在的房间号,要想进入第i层的第j个房间,必须先从第1层开始登楼梯,登到第i层后,在从第i层的第1个房间开始数,直到数到第j个房间为止。

二、通过二维数组的行指针和列指针来引用二维数组元素

        通过对二维数组的行地址和列地址的分析可知,二维数组中有两种指针。一种是行指针,使用二维数组的行地址进行初始化;另一种是列指针,使用二维数组的列地址进行初始化。

        例如,对于上图所示的二维数组a,可定义如下的行指针:

         int (*p)[4];

        在解释变量声明语句中变量的类型时,虽然说明符[ ]的优先级高于* ,但由于圆括号的优先级更高,所以先解释* ,在解释[   ] 。所以,p的类型被表示为

p-----------> * ---------------> [4] ------------>int

说明定义了一个可指向含有4个元素的一维整型数组的指针变量。关键字int代表行指针所指一维数组的类型。[ ] 中的4表示指针所指一维数组的长度,它是不可以省略的。实际上,这个指针变量p可作为一个指向二维数组的行指针,它所指向的二维数组的每一行都有4个元素。

注意:在变量声明语句中必须显式地指定指针变量所指向的一维数组的长度(对应于二维数组的列数)。对指向二维数组的行指针p仅从初始化的方法为:p = a;或 p = &p[0];

        通过行指针p引用二维数组a的元素a[i][j]的方法可用以下4种等价的形式:

p[i][j]<----------> *(p[i]+j)<----------> *(*(p+i)+j)<---------->(*(p+i))[j]

        由于列指针所指向的数据类型为二维数组的元素类型,因此列指针和指向同类型简单变量的指针的定义法是一样的。例如,对于上图的二维数组a,可定义下列指针:

int *p;

p=a[0];    p=*a;   p =&a[0][0];

定义了列指针p后,为了能通过p引用二维数组a的元素a[i][j],可将数组a看成一个由(m行×n列)个元素组成的一维数组。由于p代表数组的第0行0列的地址,而从数组的第0行第0列寻址到数组的第i行第j列,中间需跳过i×n+j个元素,因此,p+i*n+j代表数组的第i行第j列的地址,即&a[i][j],*(p+i*n+j)都表示a[i][j]。

注意:此时不能用p[i][j]来表示数组元素,这是因为此时并未将这个数组看出二维数组,而是将二维数组等同于一维数组看待的,也就是将其看成了一个具有mXn个元素的一维数组。正因如此,在定义二维数组的列指针时,无须指定他所指向的二维数组的列数。

例题:编写程序,输入一个3行4列的二维数组,然后输出这个二维数组的元素值。

#include <stdio.h>

#define N 4

void InputArray(int p[][N],int m,int n);
void OutputArray(int p[][N],int m,int n);
int main(void)
{
	int a[3][4];
	printf("Input 3*4 numbers:\n");
	InputArray(a,3,4);
	OutputArray(a,3,4);
	return 0;
}

void InputArray(int p[][N],int m,int n)
{
	int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&p[i][j]);
		}
	}
}

void OutputArray(int p[][N],int m,int n)
{
	int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			printf("%4d",p[i][j]);
		}
		printf("\n");
	}
}

#include <stdio.h>

#define N 4

void InputArray(int (*p)[N],int m,int n);
void OutputArray(int (*p)[N],int m,int n);
int main(void)
{
	int a[3][4];
	printf("Input 3*4 numbers:\n");
	InputArray(a,3,4);
	OutputArray(a,3,4);
	return 0;
}

void InputArray(int (*p)[N],int m,int n)
{
	int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
			scanf("%d",*(p+i)+j);
	}
}

void OutputArray(int (*p)[N],int m,int n)
{
	int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
			printf("%4d",*(*(p+i)+j));
	}
}

 

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

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

相关文章

8、DuiLib创建子窗口

文章目录 1、创建子窗口2、创建子窗口 XML 配置文件 1、创建子窗口 一个大规模的应用不可能只有一个窗口&#xff0c;之前我们的案例都是在一个窗口实现的&#xff0c;接下来我们实现一个关于窗口&#xff0c;来介绍如何通过 DuiLib 实现子窗口管理。 2、创建子窗口 XML 配置…

小红书种草软文怎么写?教你几招

小红书种草软文写得好&#xff0c;能打消用户的疑虑&#xff0c;吸引更多的用户关注和购买你的产品&#xff0c;从而获得源源不断的流量和口碑&#xff0c;小红书种草软文怎么写&#xff1f;接下来伯乐网络传媒就来给大家讲解一下&#xff0c;教你几招超实用的方法&#xff01;…

MMSegmentation V0.27.0官方问题(包含多尺度设置)(四)

1、在单个 GPU 上再现性能 #179&#xff08;添加链接描述&#xff09; 2、如何使用 PyTorch 的 WeightedRandomSampler 或编写自定义采样器添加链接描述 4、使用独立的分段器 #2931添加链接描述 5、How to change the training policy from Iter to Epoch based on the existin…

【产品运营】如何通过数据分析掌握用户行为?

对于运营来说&#xff0c;需要掌握用户行为来制定不同的运营策略。而用户行为是通过数据分析得出的&#xff0c;那么&#xff0c;具体的数据分析是哪些数据&#xff0c;不同的数据又有什么区别&#xff1f; 通过本文能够学到什么&#xff1f; 快速了解一款APP。行业趋势&#…

完美解决 ---latex运行正常,但是公式显示有问题,latex公式不显示等号 = 和加号 +

文章目录 一、问题展示二、分析原因三、 我的解决办法四、 \usepackage{txfonts}宏包是什么&#xff1f;五、\usepackage{amsmath}宏包是什么&#xff1f;总结 一、问题展示 latex运行正常&#xff0c;但是公式显示有问题&#xff0c;latex公式不显示等号 和加号 二、分析原…

C++基础(9)——文件操作

前言 本文主要介绍了C中文件操作基本知识 5.1&#xff1a;C语言使用标准C库函数读写文件复习 fgets、fputs&#xff08;读写文本文件&#xff09; int main(int argc, char *argv[]) {FILE *file;file fopen("a.txt", "a");if (file NULL){perror(&q…

flutter项目启动安卓模拟器不好使的问题

这里写自定义目录标题 一. 新建的flutter项目安卓模拟器不能使用二当上面操作完成以后,新建的flutter项目可以使用安卓模拟器,但是老项目不好使的解决方法 在flutter项目中,ios模拟器好使,安卓模拟器不好使. 分为2种情况: 一. 新建的flutter项目安卓模拟器不能使用 但是在and…

专业的性能测试工具都具备哪些特点?

在软件开发和系统运行过程中&#xff0c;性能是一个关键的指标&#xff0c;直接影响到用户体验和系统的可靠性。为了确保软件和系统的性能达到预期水平&#xff0c;专业的性能测试工具成为必不可少的一环。那专业的性能测试工具都具备哪些特点&#xff1f;探讨其在软件开发和系…

分享几个免费设计生成及参考工具(第三期)

今天来给大家分享几个国外免费的设计生成工具 Uxcrush https://www.uxcrush.com/ 一个收集优秀 Figma 资源的网站&#xff0c;包括网站模板、移动模板、UI套件、图标、设备模型、插画等等。希望为 Figma 用户提供一个方便找到最适合他们设计项目或学习目标的资源站。 unpromp…

用Python写了一个下载网站所有内容的软件,可见即可下

目录标题 前言效果展示环境介绍:代码实战获取数据获取视频采集弹幕采集评论 GUI部分尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 今天我们分享一个用Python写下载视频弹幕评论的代码。 顺便把这些写成GUI&#xff0c;把这些功能放到一起让朋友用起来更方便~ 效果…

FAQ页面在SaaS产品中的应用

随着云计算和软件即服务&#xff08;SaaS&#xff09;的快速发展&#xff0c;越来越多的企业选择将业务迁移到云端&#xff0c;以更好地管理和运营他们的业务。在这种背景下&#xff0c;SaaS产品的出现成为了企业管理和运营的新趋势。SaaS产品通过云端的方式&#xff0c;为企业…

【linux】不小心对整个/usr/目录执行了chmod 777命令,如何恢复故障的权限设定

一、问题背景 在安装ansys的时候&#xff0c;脑子抽风&#xff0c;以为/usr/目录是共享目录&#xff0c;直接把所有文件或目录的权限完全设置为全用户自由读写和执行即可。 但是没想到执行了命令sudo chmod -R 777 /usr/命令之后&#xff0c;出现了一大堆sudo权限错误。 较为…

基于AT89S52单片机的多功能电子万年历

1、 项目介绍&#xff08;设计内容&#xff09; 基于AT89S52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以AT89S52单片机为控制器&#xff0c;以串行时钟日历芯片DS1302记录日历…

小程序中各类二维码、小程序码,在各种场景下,长按识别支持情况验证结果

近期由于业务涉及到小程序长按识别加群、关注公众号等业务&#xff0c;各类场景下的支持情况&#xff0c;官方文档也没有特别具体的说明&#xff0c;所以整体做了一些测试。测试结果如下&#xff0c;如果有一些不准确或者未验证的情况&#xff0c;欢迎大家指正、补充哈~ 小程序…

Unity核心8——模型导入

一、模型导入概述 ​ Unity 支持很多模型格式。比如 .fbx /.dae /.3ds /.dxf /.obj 等等。 ​ 99%的模型都不是在 Unity 中制作的&#xff0c;都是美术人员在建模软件中制作&#xff0c;如 3DMax、Maya 等等。 ​ 当他们制作完模型后&#xff0c;虽然 Unity 支持很多模型格式…

公司内部资料!游戏上线前部署准备,就这新手都行

前言 游戏做的差不多了&#xff0c;是时候准备上线测试部署了&#xff0c;选一个靠谱的云服务器厂商还是很重要&#xff0c;这次准备尝试用下华为云的服务&#xff0c;为了在上线前做足准备&#xff0c;先做一次预演&#xff0c;省得到时候手忙脚乱。也给其他的同事做一个文档…

PRL:中国科大观测到单体量子系统中最强的量子互文性

近期&#xff0c;中国科学技术大学郭光灿院士团队在量子物理基本问题研究中取得重要进展。 ——该团队李传锋、许金时等与南开大学陈景灵教授、西班牙塞维利亚大学Adn Cabello教授等合作&#xff0c;实验研究了单体高维量子系统中对应于多体非定域性的量子关联&#xff0c;从而…

数据库管理-第八十三期 炒点冷饭(20230620)

数据库管理 2023-06-20 第八十三期 抄点冷饭1 ORA-040312 Shared Pool3 Library Cache4 Doc ID 2590172.15 Bug 34832725总结 第八十三期 抄点冷饭 上周&#xff0c;借着剩余的两天年假&#xff0c;又从300多个小时中拿了3天出来&#xff0c;加上前后两个周末&#xff0c;去泰…

结合符号性记忆,清华等提出ChatDB,提升大模型的复杂推理能力

结合符号性记忆&#xff0c;清华等提出ChatDB&#xff0c;提升大模型的复杂推理能力 随着大语言模型&#xff08;Large Language Models&#xff09;的爆火&#xff0c;例如 ChatGPT&#xff0c;GPT-4&#xff0c;PaLM&#xff0c;LLaMA 等&#xff0c;如何让大语言模型更好的…

自动化测试如何区分用例集合?你一定要知道

目录 前言 业务量和复杂度增长现状是什么&#xff1f; 如何区分自动化测试的用例集合&#xff1f; 区分用例集合的过程要注意什么&#xff1f; 总结&#xff1a; 前言 有同学在后台问到&#xff1a;业务比较复杂&#xff0c;有很多串行并行甚至组合的业务场景&#xff0c;执…