介绍指针与二维数组,包括一级指针如何访问二维数组以及行指针如何访问二维数组
目录
一、指针与二维数组
1.概念复习:
多维数组就是具有两个或两个以上下标的数组
在C语言中,二维数组的元素连续存储,按行优先存,在地址上是连续的几个一维数组;
int a[2][3];
a[0][0] a[0][1]
a[1][0] a[1][1] 可以分解为a[0],a[1],a[2]三个一维数组;因此在二维数组中这三个是数组名
a[2][0] a[2][1]
2.指针与二维数组的关系
(1)一个“ * ”的指针和一维数组的维度是一样的,都是在一条线上的,可以直接指向数组,但是
在二维数组中,一个二维数组不能直接用一个*的指针表示,要把数组和指针调整到一个维度上才能让指针指向数组的地址;
分析:
⚪这时候a[0]是第一行数组的数组名,代表地址常量,所以a[0]这时候是一个一维数组。可以用p指向它;
⚪因为a[0]是第一行首元素的地址,所以也是a的首元素的地址,所以两者的地址一样。
⚪这个时候a[0]是一个一维数组,所以在物理内存上加减数字能够访问到二维数组的所有元素,通俗点讲二维数组就是在物理内存上是几个一维数组串联起来的更大的一维数组;
⚪因为a[0],a[1]为数组名 ,两个数组分别一个数组代表一行 所以a加减是以行为单位的,从代码中可以看出a+1后,地址增加的是一行数组的地址空间
分析:
在纯粹的一维数组中a[i] p[i] *(p+i) *(a+i) 这几种表达方式完全相同,在二维数组中,对于*(p+i) *(a+i),p[i]是完全相同的,但是不能用a[i]来访问数组元素,因为这时候a[0],a[1]都是数组名了,是地址常量
二、行指针
1. 二维数组名代表数组的起始地址,数组名加1,是移动一行元素。因此,二维数组名常被称为行地址
2.
行指针(数组指针)
存储行地址的指针变量,叫做行指针变量。
形式如下: <存储类型> <数据类型> (*<指针变量名>)[表达式] ;
例如,int a[2][3]; int (*p)[3]; 方括号中的常量表达式表示指针加1,移动几个数据。
当用行指针操作二维数组时,表达式一般写成1行的元素个数,即列数。
(1)
分析:
⭕当用行指针表示二维数组时,此时二维数组和行指针的类型是一样的,相当于是在一个维度上,所以此时p可以直接指向a,因此p和a地址值相同,可以用p替换a做数组名;
⭕直接对二维数组或者行指针取“ * ”,相当于是把数组或者行指针降级改变性质(即降低维度)
从上图可得
*(a+1)为a[1],而在二维数组中,a[1]是一个一维数组名,所以 此时进行的是一个数组名为a[1]的一维数组的操作,此时a[1]加减访问的是一列一列的数组元素的地址;
程序举例如下:
总结
主要介绍了指针与二维数组,包括一级指针如何访问二维数组以及行指针如何访问二维数组