数组指针和指针数组

article/2025/9/21 20:03:01

首先,理解一下数组指针和指针数组这两个名词:

“数组指针”和“指针数组”,只要在名词中间加上“的”字,就知道中心了——

数组的指针:是一个指针,什么样的指针呢?指向数组的指针。

指针的数组:是一个数组,什么样的数组呢?装着指针的数组。

然后,需要明确一个优先级顺序:()>[]>*,所以:

(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;

*p[n]:根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组。

根据上面两个分析,可以看出,p是什么,则词组的中心词就是什么,即数组“指针”和指针“数组”。
 

int *p1[5];
int (*p2)[5];

首先,对于语句“int*p1[5]”,因为“[]”的优先级要比“*”要高,所以 p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,而“int*”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。

                                       图1 

其次,对于语句“int(*p2)[5]”,“()”的优先级比“[]”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,p2 是一个指针,它指向一个包含 5 个 int 类型数据的数组,如图 2 所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。

                                    

                                                               图2 

由此可见,对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。
 

数组指针 (*p)[n]

数组指针:是指针——指向数组的指针。

看下面的例子进行理解

#include "stdafx.h"int main()
{//一维数组int a[5] = { 1, 2, 3, 4, 5 };//步长为5的数组指针,即数组里有5个元素int (*p)[5];//把数组a的地址赋给p,则p为数组a的地址,则*p表示数组a本身p = &a;//%p输出地址, %d输出十进制//\n回车//在C中,在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址,它的类型取决于数组元素的类型。printf("%p\n", a); //输出数组名,一般用数组的首元素地址来标识一个数组,则输出数组首元素地址printf("%p\n", p); //根据上面,p为数组a的地址,输出数组a的地址printf("%p\n", *p); //*p表示数组a本身,一般用数组的首元素地址来标识一个数组printf("%p\n", &a[0]); //a[0]的地址printf("%p\n", &a[1]); //a[1]的地址printf("%p\n", p[0]); //数组首元素的地址printf("%d\n", **p); //*p为数组a本身,即为数组a首元素地址,则*(*p)为值,当*p为数组首元素地址时,**p表示首元素的值1printf("%d\n", *p[0]); //根据优先级,p[0] 表示首元素地址,则*p[0]表示首元素本身,即首元素的值1printf("%d\n", *p[1]); //为一个绝对值很大的负数,不表示a[1]...表示什么我还不知道//将二维数组赋给指针int b[3][4];int(*pp)[4]; //定义一个数组指针,指向含4个元素的一维数组pp = b; //将该二维数组的首地址赋给pp,也就是b[0]或&b[0],二维数组中pp=b和pp=&b[0]是等价的pp++; //pp=pp+1,该语句执行过后pp的指向从行b[0][]变为了行b[1][],pp=&b[1]int k;scanf_s("%d", &k);return 0;
}

根据上面二维数组可以得出,数组指针也称指向一维数组的指针,所以数组指针也称行指针。

指针数组 *p[n]

指针数组:是数组——装着指针的数组。

看下面的例子进行理解:

#include "stdafx.h"int main()
{int a = 1;int b = 2;int *p[2];p[0] = &a;p[1] = &b;printf("%p\n", p[0]); //a的地址printf("%p\n", &a); //a的地址printf("%p\n", p[1]); //b的地址printf("%p\n", &b); //b的地址printf("%d\n", *p[0]); //p[0]表示a的地址,则*p[0]表示a的值printf("%d\n", *p[1]); //p[1]表示b的地址,则*p[1]表示b的值//将二维数组赋给指针数组int *pp[3]; //一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值int c[3][4];for (int i = 0; i<3; i++)pp[i] = c[i];int k;scanf_s("%d", &k);return 0;
}

最后,从上文来看:

数组指针是一个指针变量,占有内存中一个指针的存储空间;

指针数组是多个指针变量,以数组的形式存储在内存中,占有多个指针的存储空间。

 

了解指针数组和数组指针二者之间的区别之后,继续来看下面的示例代码:

int arr[5]={1,2,3,4,5};
int (*p1)[5] = &arr;
/*下面是错误的*/
int (*p2)[5] = arr;

不难看出,在上面的示例代码中,&arr 是指整个数组的首地址,而 arr 是指数组首元素的首地址,虽然所表示的意义不同,但二者之间的值却是相同的。那么问题出来了,既然值是相同的,为什么语句“int(*p1)[5]=&arr”是正确的,而语句“int(*p2)[5]=arr”却在有些编译器下运行时会提示错误信息呢(如在 Microsoft Visual Studio 2010 中提示的错误信息为“a value of type"int*"cannot be used to initialize an entity of type"int(*)[5]"”)?

其实原因很简单,在 C 语言中,赋值符号“=”号两边的数据类型必须是相同的,如果不同,则需要显示或隐式类型转换。在这里,p1 和 p2 都是数组指针,指向的是整个数组。p1 这个定义的“=”号两边的数据类型完全一致,而 p2 这个定义的“=”号两边的数据类型就不一致了(左边的类型是指向整个数组的指针,而右边的数据类型是指向单个字符的指针),因此会提示错误信息。


http://chatgpt.dhexx.cn/article/1EimT9IT.shtml

相关文章

如何下载风云卫星数据?

如何下载风云卫星数据&#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 土地利用…

高分卫星数据介绍

高分专项目前已经发射了7颗遥感卫星。高分一号卫星&#xff0c;高分辨率相机全色分辨率2米、多光谱分辨率8米&#xff0c;并携带16米分辨率幅宽800千米的宽幅相机&#xff0c;是典型的高时间分辨率&#xff08;宽覆盖&#xff09;遥感卫星&#xff1b;高分二号卫星&#xff0c;…

Sentinel卫星数据

Sentinel(哨兵系列) “哨兵”系列卫星是欧洲哥白尼&#xff08;Copernicus&#xff09;计划[之前称为“全球环境与安全监测”&#xff08;GMES&#xff09;计划]空间部分&#xff08;GSC&#xff09;的专用卫星系列&#xff0c;由欧洲委员会&#xff08;EC&#xff09;投资&am…

国内外卫星数据查询地址

文章目录 国内卫星数据查询1、中国资源卫星应用中心2、自然资源卫星遥感云服务平台3、全国各省市高分中心4、国家对地观测与数据中心&#xff08;高分辨率对地观测系统网格平台&#xff09;5、中国海洋卫星数据服务系统6、卫星云遥7、上海市自然资源卫星遥感云服务平台8、国家综…

卫星相关公开数据集

Satellite 卫星数据 1957-2022 背景描述 卫星是有意放入轨道的物体。 这些物体被称为人造卫星&#xff0c;以区别于地球的月球等天然卫星。 1957年10月4日&#xff0c;苏联发射了世界上第一颗人造卫星Sputnik 1。 数据说明 Norad ID&#xff1a;卫星目录号&#xff08;SATCA…