C/C++语言中的int a; int* a; int** a; int (*a)[]; int (*a)(int),重点介绍指针数组与数组指针

您所在的位置:网站首页 A什么A C/C++语言中的int a; int* a; int** a; int (*a)[]; int (*a)(int),重点介绍指针数组与数组指针

C/C++语言中的int a; int* a; int** a; int (*a)[]; int (*a)(int),重点介绍指针数组与数组指针

2024-07-17 03:03:00| 来源: 网络整理| 查看: 265

这一部分往往很少被总结,但是却经常用到,在使用的时候要注意区分。

先来一个基本的来入门吧! 参考自: https://blog.csdn.net/qq_36744540/article/details/79832728

数组指针

首先,我们先介绍一下二维数组和二维数组的指针,二维数组相当于一个特殊的一维数组里面每个元素又是一个一维数组,例如:int a [ 3 ] [3],可以看成一个3行的一个列数组,每一列的元素又是一个长度为3的数组,数组名的一个特殊一维数组的首地址,如下: 在这里插入图片描述 a(第0行的首地址,也是可以是&a [0])指向a [0],对0行首地址元素的引用就有 a = a [0]; a + 1(第一行的首地址)指向a [1],有(a + 1)= a [1]; a + 2(第二行的首地址)指向a [2],有*(a + 2)= a [2]; a + i(第i行的首地址)指向一个[i]中,有*(a + 1)= a [i]中。 而a[0],a[1],a[2]又是里面一维数组的数组名,因此a[i]可表示i行的首地址: a[0](第0行第0个元素的地址)指向一个[0] [ 0 ],有*(a [ 0 ] +0)= a [0] [ 0 ]; a [0]+1(第0行第1个元素的地址)指向a [0] [1],有*(a [0] +1)= a [0] [1]; a [0] +2(第0行第2个元素的地址)指向a [0] [2],有*(a [0] +2)= a [0] [2] 总结:a[i]+j(第i行第j列个元素的地址)指向a[i][j], 有*(a[i]+j)=a[i][j], 即 * (*(a+i)+j)=a[i][j]。

二维数组的指针变量

对于指向二维数组的指针变量p,可以有两种: 一种是指向数组元素的列指针,一种是指向行的行指针,这时,p不是指向一个具体的数组元素,而是指向一个包含m个元素的一维数组。这里对行指针特殊说明一下; 行指针的定义形式为:类型标识符 (*指针变量名)[长度]; 例如: int a[3][4],(*p)[4]=a; //这里也可以写为int a[3][4],(*p)[4]=&a[0]; 其中p,p+1,p+2和a,a+1,a+2都是第i行的首地址。 使用指针变量访问二维数组的任意一个元素的方法 **(1)使用列指针:**定义一个列指针p,让它指向二维数组的第0个元素

int a[3][4]; int *p; p=&a[0][0]; //因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素,该二维数组的任意i行j列元素可表示为*(p+i*4+j)

(2)使用行指针:定义一个行指针p,让它指向二维数组的第0行

int a[3][4]; int (*p)[4]; p=a; //也可以为p=&a[0];

其中* ( *(p+i)+j)表示任意一个i行j列的元素。

多说一句,其实访问方式还可以很灵活的,跟直接使用数组名访问一样也可以,后面还会详细讨论。

参考自:https://www.cnblogs.com/zou107/p/4909847.html

一、关于二维数组和二维数组区别

(1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的。所以从内存的角度来分析,一维数组和二维数组其实没有本质区别。

(2) 二维数组可以使用一维数组来代替。但是在实际的应用中,有时候使用二维数组会更加直观,方便程序的编程。

(3)两者在内存使用效率上是一模一样的。

二、二维数组的第一维和第二维概念

(1)例如 int a[2][5]中,前面的2表示第一维;后面的5表示第二维

(2) 二维数组的第一维表示最外部的那一层,第一维本身也是一个数组,里面存放了2个元素,这两个元素就分别是第二维的数组。第二维数组本身也是一个数组,里面存放的元素是普通的int型变量。 在这里插入图片描述

三、二维数组的下标访问

例1:

1 int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; 2 int (*p)[5]; // 定义一个数组指针 3 p = a; 4 5 printf(" a[1][2] = %d.\n", a[1][2]); // a[1][2] = 8 6 printf("(*(p+1)+1) = %d.\n", *(*(p+1)+2)); // a[1][2]

运行结果: 在这里插入图片描述

四、关于二维数据必须要明白的几个符号

例2:理解 a 、&a、 a[0]、 &a[0]、 a[0][0]、 &a[0][0]

/* 二维数组的几个符号的测试 1、a等同于&a[0] 2、a[0]等同于&a[0][0] 3、在数值上 a、&a、a[0]、&a[0]、&a[0][0] 是相等的,但是在类型上面是有区别的。 */ int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; printf("a = %p.\n", a); // a 类型是 int (*)[5] printf("&a = %p.\n", &a); // &a 类型是 int (*)[2][5] printf("a[0] = %p.\n", a[0]); // a[0] 类型是 int * printf("&a[0] = %p.\n", &a[0]); // &a[0] 类型是 int (*)[5] printf("a[0][0] = %d.\n", a[0][0]); // a[0][0] 类型是 int printf("&a[0][0] = %p.\n", &a[0][0]); // &a[0][0]类型是 int *

运行结果: 在这里插入图片描述

例3:第一维和第二维的数组指针的使用 // 二维数组与指针的结合使用 int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; int (*p1)[5]; // 数组指针 int *p2; // 一般指针 p1 = a; // 等同 p1 = &a[0]; // 指向二维数组的数组名 p2 = a[0]; // 等同 p2 = &a[0][0]; // 指向二维数组的第一维数组 printf("a[0][2] = %d.\n", *(*(p1+0)+2)); // a[0][2] = 3 printf("a[1][2] = %d.\n", *(*(p1+1)+2)); // a[1][2] = 8 printf("a[0][2] = %d.\n", *(p2+2)); // a[0][2] = 3 printf("a[0][4] = %d.\n", *(p2+4)); // a[0][4] = 5

运行结果: 在这里插入图片描述

五、总结

(1)需要理解二维数组的实质和几个符号的含义。

(2)二维数组和数组指针两者是有紧密的关系的。学会使用数组指针来操作二维数组,重在实践操作使用就会加深理解。

**注:学习笔记部分是在朱有鹏老师物联网视频教程中摘取,特此声明。**http://www.zhulaoshi.org/

a) int a;表示一个内存空间,这个空间用来存放一个整数(int); b) int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间; c) int** a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间; d) int (a)[4];表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为4、类型为int的数组;和int* a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。 以上四种类型见上图表示。 e) int (*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。

多说一句,都是指针,有时候可能值相同,但是意义却不同,使用方式或者说数据格式也不同。

重点: int *p[]和int (*p)[]

前者是指针数组,后者是指向数组的指针。更详细地说。

前: 指针数组;是一个元素全为指针的数组. 后: 数组指针;可以直接理解是指针,只是这个指针类型不是int也不是char而是 int [4]类型的数组.(可以结合函数指针一并看看…)

int*p[4]------p是一个指针数组,每一个指向一个int型的 int (*q)[4]---------q是一个指针,指向int[4]的数组。

定义涉及两个运算符:“”(间接引用)、“[]”(下标),“[]”的优先级别大于“”的优先级别。小括号或者说圆括号优先级最大。

首先看int *p[4],“[]”的优先级别高,所以它首先是个大小为4的数组,即p[4];剩下的“int *”作为补充说明,即说明该数组的每一个元素为指向一个整型类型的指针。int *p[4]的存储结构如下:(存储方格横向排列或竖向排列没区别,只要按内存地址顺序排列就行,此处只是为画图方便) 在这里插入图片描述

再看int (q)[4]。它首先是个指针,即q,剩下的“int [4]”作为补充说明,即说明指针q指向一个长度为4的数组。int (*q)[4]的存储结构如下:

在这里插入图片描述

请看以下定义:

int a[2][4]={{2,5,6,8},{22,55,66,88}}; int c[4]={5,8,9,4}; int d[3]={23,12,443}; int *p[4],(*q)[4]; q=a; *p=c; *(p+1)=d;

则int *p[4]和int (*q)[4]的存储数据为:

在这里插入图片描述

在这里插入图片描述

验证: #include int main(void) { int a[2][4]={{2,5,6,8},{22,55,66,88}}; int c[4]={5,8,9,4}; int d[3]={23,12,443}; int *p[4],(*q)[4]; q=a; *p=c; *(p+1)=d; int i,j; for(i=0;i


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭