指针数组和数组指针的区别及其详解

article/2025/9/22 4:43:01

引言

对于指针数组和数组指针的概念,相信很多人经常会感到迷惑,见到二者一时不能分辨究竟对应哪一个才是对的。接下来我们来分析一下二者区别。
我们来看一下这个示例代码:

int *ptr1[10];
int (*ptr2)[10];

对于上述代码语句,你是否能分清哪一句代码声明的是指针数组,而哪一句代码声明的又是数组指针呢?
答案是第一行代码声明的ptr1是一个指针数组,数组名为 ptr1,而“int*”修饰的是数组的内容,该数组包含 10 个指向 int 类型数据的指针。第二行代码声明的 ptr2 则是一个数组指针,指针变量名为 ptr2,而 int 修饰的是数组的内容,即数组的每个元素。即ptr2 是一个指针,它指向一个包含 10 个 int 类型数据的数组。要想进一步弄清楚二者区别,我们接着看后边内容。

一、指针数组和数组指针的概念

  • 指针数组: 指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。
    指针数组

  • 数组指针: 数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。
    数组指针

二、指针

为进一步理解指针数组和数组指针,我们回顾一下指针:

int var = 20;	//var是变量,普通变量存放的是实际的值
int *p;			//*p是指针,指针变量存放的是地址
p = &var;		//p的值是var的地址,指针变量的值是具有实际值的变量的地址
*p = 10;
cout<< var <<endl;;

上述代码执行结果为10。
其中,指针变量有类型,即指针存放的地址指向的数据类型。“ * ”用来访问指针的值所表示的地址上的变量;“&”用来取得变量的地址;此时,我们可以得到*p=var,它们完全等价,具体原理可以写成:

*(访问指针的值所记录的地址)+p(p的地址)=var

考虑一下代码:

#include<iostream> 
using namespace std;
int main() { int arr[5] = { 1, 2, 3, 4, 5 }; int *ptr = arr; 	//ptr指针指向数组第0个元素的地址cout<< ptr <<endl;return 0; 
}

再考虑如下声明:

int (*ptr)[5];

ptr指针指向一个大小为5的int型数组,由于[]的优先级高于*,因此加小括号即可让指针指向整个数组。ptr的类型是“指向数组中5个整数的指针”。

三、C/C++运算符优先级

为了更进一步方便看清代码意义,分解代码变量声明内容,我们来看一下C/C++中运算符的优先级。从上到下,从左到右,优先级一次减弱。
在这里插入图片描述

从上述表中我们可以看到,()、[]、* 的运算级优先级依次递减。
因此,对于指针数组来说,[] 的运算级高于 * 的运算级,则现有数组,再有指向数组元素的指针。而对于数组指针,() 运算级最高,先执行圆括号中的 * 获得指针,然后再让指针指向整个数组。

四、示例代码解析

在进行上述了解之后,我们再来看一下下边的示例代码:

int arr[3]={123};
int (*p1)[3] = &arr;

注意第二行代码写法,下述写法是错误的:

int (*p2)[3] = arr;

在上面的示例代码中,&arr 是指整个数组的首地址,而 arr 是指数组首元素的首地址。虽然第二种写法是错误的,所表示的意义不同,但二者之间的值却是相同的。为什么语句“int(*p1)[3]=&arr”是正确的,而语句“int(*p2)[3]=arr”却在有些编译器下会报错呢?

究其原因,在 C/C++ 中,对于变量的类型有严格要求,其涉及的变量类型是强类型模式。赋值符号“=”号两边的数据类型必须是相同的,如果不同,则需要显示或隐式类型转换。在这里,p1 和 p2 都是数组指针,指向的是整个数组。p1 这个定义的“=”号两边的数据类型是一致的,而 p2 这个定义的“=”号两边的数据类型则不一致(左边的类型是指向整个数组的指针,而右边的数据类型是指向单个字符的指针),因此会提示错误信息。


http://chatgpt.dhexx.cn/article/AVSjOOj8.shtml

相关文章

C语言学习—数组指针和指针数组的区别

前言 本文章对指针数组和数组指针的区别进行了分析介绍 一、数组指针和指针数组的定义 1.数组指针&#xff1a;定义 int (*p)[n]; 由于()的优先级高&#xff0c;首先说明p是一个int类型指针&#xff0c;它是指向一个整型(int)的一维数组&#xff0c;这个一维数组的长度是n&a…

指针数组和数组指针

1.什么是指针数组和数组指针 顾名思义&#xff1a;指针数组是“存放指针的数组”&#xff0c;这个变量是一个数组&#xff0c;用指针修饰&#xff0c;数组中的每个元素都是指针。 数组指针是“指向数组的指针”&#xff0c;这个变量是一个指针&#xff0c;用数组修饰&#xf…

指针数组和数组指针(非常易懂)

指针数组与数组指针 目录&#xff1a; 1.指针与一维数组 2.指针与二维数组 3.指针数组与数组指针 1.指针与一维数组 当定义一个一维数组时&#xff0c;系统会在内存中为改数组分配一个储存空间&#xff0c;其数组的变量名就是数组的首地址。若定义一个指针变量&#xff0c;并…

数组指针和指针数组

首先&#xff0c;理解一下数组指针和指针数组这两个名词&#xff1a; “数组指针”和“指针数组”&#xff0c;只要在名词中间加上“的”字&#xff0c;就知道中心了—— 数组的指针&#xff1a;是一个指针&#xff0c;什么样的指针呢&#xff1f;指向数组的指针。 指针的数…

如何下载风云卫星数据?

如何下载风云卫星数据&#xff1f; 这个是下载风云数据的网址&#xff1a; http://satellite.nsmc.org.cn/PortalSite/Data/Satellite.aspx 1.查找数据 步骤见如图1&#xff1a; 2.选择数据 选择“搜索”以后就就出现图2这个页面&#xff1a;文件名如果被省略了&#xff0…

总结部分SAR卫星及其参数以及SAR卫星发展的趋势

总结国内外失效、在轨和未来发射的SAR卫星及其参数 国内的SAR卫星及其参数 1、高分三号卫星 高分三号卫星(GF-3)于2016年8月10日成功发射&#xff0c;是我国首颗分辨率达到1米的C频段多极化合成孔径雷达(SAR)卫星&#xff0c;自然资源部为其主用户。 GF-3星的分辨率可以达到…

spot卫星介绍与数据下载

1.简介 1.1基本信息 SPOT系列卫星是法国空间研究中心&#xff08;CNES&#xff09;研制的一种地球观测卫星系统&#xff0c;已发射SPOT卫星1-7号。目前CNES已开放spot1-5的卫星数据&#xff0c;可免费下载数据的时间范围为1986年-2014年。 1.2卫星年表 名称信息SPOT-11986年…

空气污染气体卫星数据的下载教程

影响空气质量的主要气体有&#xff1a;二氧化硫、一氧化碳、二氧化氮、可吸入颗粒和臭氧等。我们可以通过Giovanni平台下载空气污染气体的卫星产品数据。 Giovanni平台介绍 Giovanni&#xff0c; 是NASA 旗下的地球科学可视化工具。通过简单的操作&#xff0c;即可将NASA 相关…

GRACE卫星介绍与解密数据下载

1 简介 1.1 基本信息 GRACE &#xff0c;Gravity Recovery and Climate Experiment&#xff0c;由 NASA 和德国宇航中心&#xff08;DLR&#xff09;联合研制&#xff0c;于 2002 年 3 月 17 日在发射。发射 时其预计寿命为 5 年&#xff0c;一直超期服役到2017年坠毁。后继卫…

风云气象卫星数据处理调研报告

风云卫星遥感数据服务平台 http://www.nsmc.org.cn/NSMC/Home/Index.html http://data.nsmc.org.cn/PortalSite/Default.aspx 风云四号气象卫星是我国第二代静止气象卫星&#xff0c;充分考虑海洋、农业、林业、水利以及环境、空间科学等领域的需求&#xff0c;以实现综合利用…

worldview卫星数据的查询方法

地理遥感生态网平台代理worldview1、worldview2、worldview3、worldview4、quickbird、geoeye、ikonos、 pleiades、spot1、spot2、spot3、spot4、spot5、spot6、spot7、landsat5(tm)、landsat(etm)、landsat8、rapideye、alos、aster、Hyperion(EO-1)、kompsat2、kompsat-3、k…

PL(Planet)卫星群遥感数据介绍及应用

1. 卫星介绍 星球实验室&#xff08;Planet Labs&#xff09;是由前美国空间局&#xff08;NASA&#xff09;科学家于2010年在旧金山成立的一家遥感卫星数据公司。该公司在世界上首次研发成功微卫星群技术&#xff0c;是世界上唯一具有全球高分辨率高频次全覆盖的遥感卫星系统…

CloudSat卫星数据下载

介绍 CloudSat标准数据产品由位于柯林斯堡的科罗拉多州立大学大气合作研究机构的CloudSat数据处理中心分发。数据产品ID以及产品名如下&#xff1a; 下载 方式1&#xff0c;交互式下载。 在官网注册&#xff0c;官网&#xff1a;http://www.cloudsat.cira.colostate.edu/o…

预处理——HJ卫星数据

&#xff08;遥感数据打开后&#xff0c;为了呈现更好的显示结果&#xff0c;都进行2%的拉伸&#xff0c;下面不再赘述&#xff09; &#xff08;一&#xff09;图像裁剪 1、打开2016年的HJ1A-CCD2卫星数据→File→Save as→Spatial Subset→选择要裁剪的东平湖区域→OK 2、…

基于学术研究风云卫星数据下载教程

目录 一、相关网址 1.登录注册网址&#xff1a;国家卫星气象中心 2.风云数据服务客户端下载网址 3.风云卫星遥感数据服务网址 二、下载数据步骤 1.首先在注册登录网址&#xff0c;注册一个账户 2.待账户审核后&#xff0c;登录账户即可搜索并下载数据 三、相关工具下载…

葵花(Himawari)8/9卫星数据处理

李国春 葵花8&#xff08;含葵花9&#xff0c;下同&#xff09;是静止气象卫星&#xff0c;数据范围是星下点为140E赤道上空的大圆盘。空间分辨率有500m、1km和2km三种。虽然其空间分辨率不高&#xff0c;但是有极高的时间分辨率&#xff0c;观测数据刷新仅10分钟。这对一些生…

葵花卫星数据介绍与下载教程

1.数据介绍 1.1卫星介绍 葵花系列卫星是日本发射的地球同步轨道的气象卫星&#xff0c;多国将该系列卫星用于本国的天气监测和天气预报。 1.2卫星年表 目前服役的是葵花8号卫星&#xff0c;葵花9号虽然已发射&#xff0c;但是被闲置&#xff0c;预计到2022年&#xff0c;接替…

中国遥感卫星详细参数信息

中国遥感卫星详细参数信息 文章目录 **中国遥感卫星详细参数信息**01卫星命名规则02遥感卫星的分类03常见地面站标识&#xff1a;04产品级别&#xff08;形式&#xff09;&#xff1a;1) L1A&#xff1a;复数据产品(SLC) 2) L1B&#xff1a;1. 单视图像产品(SLP)2. 多视图像产品…

NPP VIIRS卫星数据介绍

VIIRS&#xff08;Visible infrared Imaging Radiometer&#xff09;可见光红外成像辐射仪。扫描式成像辐射仪&#xff0c;可收集陆地、大气、冰层和海洋在可见光和红外波段的辐射图像。他是高分辨率辐射仪AVHRR和地球观测系列中分辨率成像光谱仪MODIS系列的拓展和改进。VIIRS数…

遥感影像云检测-现有光学遥感卫星数据参数合集

现有光学遥感卫星 1.MODIS卫星介绍1.1.MODIS传感器简介1.2.MODIS传感器基本参数1.3.MODIS 数据特点及波段分布特征1.4.MODIS 数据产品产品级别及类型1.4.1.产品级别1.4.2.产品类型 1.5.MODIS 1B数据简介1.6.MODIS 命名规则1.7.MODIS 应用领域1.6.1.水文水资源监测1.6.2 土地利用…