数组指针 和 指针数组 的区别

article/2025/9/22 4:07:41

目录

  • 0. 引言
  • 1. 数组指针
  • 2. 指针数组
  • 3. 小结

本文使用运行环境如下:
操作系统:Ubuntu Linux 18.04 64 bit
编译环境:gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

0. 引言

数组指针指针数组且听之类似,实际完全不同。数组指针意在“指针”,强调的是指针,即“指向数组的指针”;指针数组意在“数组”,强调的是数组,即“成员都是指针的数组”。

本文尝试阐述二者的不同之处。

1. 数组指针

数组指针如何定义与使用?先看一个示例程序arr_p.c

#include <stdio.h>int main()
{/* 定义一个有10个int成员的数组 */int arr_i[10] = {0,1,2,3,4,5,6,7,8,9};/* 定义一个指向有10个int成员的数组指针,并初始化为arr_i数组的地址 */int (*arri_p)[10] = &arr_i;/* 定义一个2*2的二维数组,在内存中以一维排列,实际是数组的数组arr数组成员类型为int (*)[2],数组元素为arr[0]和arr[1]对arr的数组成员arr[0]和arr[1],其本身也是数组,成员为int*/int arr[2][2] = {{1,2},{3,4}};/* 定义一个指向有2个int成员的数组指针,并初始化为arr数组第0个成员的地址 */int (*arr_p)[2] = &arr[0];/* 等价于int (*arr_p)[2] = arr; */printf("数组arr_i的地址:            %#lx\n", (unsigned long int)&arr_i);printf("数组指针arri_p的值:         %#lx\n", (unsigned long int)arri_p);printf("数组指针arri_p+1的值:       %#lx\n", (unsigned long int)(arri_p+1));printf("==========================================\n");printf("数组arr的地址:              %#lx\n", (unsigned long int)&arr);printf("数组指针arr_p的值:          %#lx\n", (unsigned long int)arr_p);printf("数组指针arr_p+1的值:        %#lx\n", (unsigned long int)(arr_p+1));printf("arr第一个成员的地址&arr[1]: %#lx\n", (unsigned long int)&arr[1]);printf("数组指针arr_p+1处的数组值:  %d\n", *(int*)(arr_p+1));return 0;
}

执行结果:

$ gcc arr_p.c
$ ./a.out 
数组arr_i的地址:            0x7ffc5289ace0
数组指针arri_p的值:         0x7ffc5289ace0
数组指针arri_p+1的值:       0x7ffc5289ad08
==========================================
数组arr的地址:              0x7ffc5289acd0
数组指针arr_p的值:          0x7ffc5289acd0
数组指针arr_p+1的值:        0x7ffc5289acd8
arr第一个成员的地址&arr[1]: 0x7ffc5289acd8
数组指针arr_p+1处的数组值:  3

image-20201021133956785

arr_i是一个有10个int成员的数组,数组类型为int [10]arri_p是这个数组类型的指针并指向了arr_i数组。在代码第20行和21行的打印中,arri_p指向了arr_i数组,因此数组arr_i的地址指针arri_p的值必然相等;

22行对指针arri_p进行指针运算,指针指向的类型是int [10],这里是64位系统64位程序,对指针+1运算就转化成了(unsigned long int)arri_p+sizeof(arr_i)*1arr_i数组占用内存大小为40个字节,因此指针arri_p+1之后将偏移40个字节(数组的大小),刚好0x7ffc5289ad08 - 0x7ffc5289ace0 = 0x28 = 40

这里数组指针arri_p+1之后其指向了数组范围之外,这样一看指针运算似乎就没什么用了,还有内存越界的风险。

image-20201021134120410

再看13行往下的代码,定义了一个类型为int (*)[2]的二维数组arr,同样用一个数组指针arr_p指向arr数组,28行对指针arr_p+1时,其结果也是和arr数组偏移一个成员之后的地址相同。这里可以看出指针运算的原理是通用的,对指针+1将偏移指针指向对象的类型大小。

那么指针arr_p+1后偏移了多少字节?0x7ffc5289acd8 - 0x7ffc5289acd0 = 0x8 = 8,即一个int [2]成员的大小,就是arr数组第1行{1,2}所占用的空间,似乎不够有说服力,30行对arr_p+1后的位置进行取值,结果表明arr_p+1后指向了二维数组arr第2行第1个元素值为3,即arr_p+1后在二维数组中“换了一行”,因此有的地方也将数组指针称为“行指针”。

image-20201021134545214

2. 指针数组

顾名思义,指针数组是一个成员为“同一指针类型的数组”,这里也通过一个示例程序进行说明。p_arr.c

#include <stdio.h>int main()
{int i = 0;int arr[3] = {1,2,3};int a = 10;/* int *p[4]等价于int *(p[4]) */int *p[4] = {&arr[0], &arr[1], &arr[2], &a};for(i = 0; i < sizeof(p)/sizeof(*p); i++){printf("*p[%d] = %d\n", i, *p[i]);}return 0;
}

运行结果:

$ gcc p_arr.c 
$ ./a.out 
*p[0] = 1
*p[1] = 2
*p[2] = 3
*p[3] = 10

image-20201021135423758

指针数组较之数组指针易于理解,p是一个有4个成员的数组,每个成员都是int *类型,由于每个成员都是int *,因此p[i]既表示p数组的第i个成员,又表示某个int对象的地址。要访问p数组中保存的对象的地址所指向的对象,就需要对p数组中的成员解引用(取相应地址保存的数据),12行中*p[i]是对p数组中的第i个成员解引用,这种方式能够正常访问合法的地址对象。

3. 小结

  1. 数组指针本质是指针,是指向数组的指针;
  2. 指针数组本质是数组,是保存指针的数组;

从对指针数组和数组指针的分析来看,虽然两者都和指针相关,但指针和数组不可同日而语,对二者的混淆很大可能是中文概念的混淆。


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

相关文章

C语言(函数指针数组)详解

要了解函数指针数组&#xff0c;可以从三个角度来分析。所谓函数指针数组&#xff0c;从字面意思上来解析&#xff0c;函数指针数组的组成有三个点&#xff0c;函数&#xff0c;指针&#xff0c;数组。首先我们知道&#xff0c;函数指针数组&#xff0c;是一个数组&#xff0c;…

c语言 指针数组

文章目录 前言一、指针数组的定义声明,赋值&#xff1a;二、指针数组的应用&#xff1a;总结 前言 今天我们讲解一下什么是指针数组。 一、指针数组的定义声明,赋值&#xff1a; 什么是指针数组呢&#xff1f; 指针数组 &#xff1a;就是首先定义一个数组&#xff0c;数组里面…

c语言之——指针数组与数组指针

一、指针数组和数组指针的定义 1. 指针数组&#xff1a;是指一个数组里面装着指针&#xff0c;也即指针数组是一个数组&#xff1b; 定义形式&#xff1a;int *a[10]&#xff1b; 说明&#xff1a;[]的优先级高于*&#xff0c;该定义形式应该理解为&#xff1a;int * (a[10]…

关于指针数组与数组指针详解(知识点全面)

1.目录 1.指针数组 2.数组指针 2.它们的区别 1.指针数组 如果一个数组中的所有元素保存的都是指针&#xff0c;那么我们就称它为指针数组。其一般形式为&#xff1a; 数据类型 *数组名[常量表达式][常量表达式]...... ; 它是一个数组&#xff0c;数组的元素都是指针&…

指针数组(指针类型的数组)

顾名思义&#xff1a;指针类型的数组&#xff0c;首先是一个数组&#xff0c;数组元素存储的是指针。(中国的修饰词往往都在前面&#xff0c;而西方修饰词往往是放在后面) 语法如下&#xff1a; 目标类型 数组名称[元素个数] 如&#xff1a;int * p[3] 数组p有3个元素&#x…

数组指针和指针数组的区别

文章目录 前言 一、什么是指针数组&#xff1f; 1.定义 2.声明 3.指针数组的内存示意图 二、什么是数组指针&#xff1f; 1.定义 2.声明 3.内存示意图 三、如何区别指针数组和数组指针&#xff1f; 四、实践理解 总结 前言 这几天老师有问到指针数组和数组指针的区别&#xff…

C语言—指针数组与数组指针

前言&#xff1a; 看到标题的小伙伴可能会有点疑惑&#xff0c;什么是指针数组&#xff0c;数组指针&#xff1f;&#xff1f;傻傻分不清楚&#xff0c;不怕&#xff0c;听我慢慢道来。 正文&#xff1a; 要想弄清楚这两个概念&#xff0c;我们不妨举几个例子&#xff1a; …

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

引言 对于指针数组和数组指针的概念&#xff0c;相信很多人经常会感到迷惑&#xff0c;见到二者一时不能分辨究竟对应哪一个才是对的。接下来我们来分析一下二者区别。 我们来看一下这个示例代码&#xff1a; int *ptr1[10]; int (*ptr2)[10];对于上述代码语句&#xff0c;你…

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;是世界上唯一具有全球高分辨率高频次全覆盖的遥感卫星系统…