c语言把二维数组看作是一维数组的集合,即二维数组是一个元素为一维数组的特殊一维数组
不带任何下标的二维数组名表示二维数组的起始地址.
只带一维下标的二维数组名表示作为其元素的一个一维数组(即二维数组一行)的起始地址,对其进行加法操作时表示该一维数组(即二维数组一行)的一个元素的地址。
例:
此时p指向一维数组a[0]的起始地址,即p、a[0]、&a[0][0]相同。对其进行加法操作时p+1等同于a[0]+1,都指向数组元素a[0][1].所以*(p+1)等于元素a[0][1]的值。
输入输出二维数组a[2][3]全部元素。
#include "stdio.h"
void main()
{
}
由此可见,任何一个二维数组a[m][n]的元素a[i][j]的地址,都可以用a[0]+i*n+j来表示。大多数浮点型的多维数组都采用此种方法处理。此外由于这种方法无需知道数组的行数和列数,只要根据数组的元素总数即可进行数组的数据处理。所以他的通用性更好。
指向二维数组中一维数组的指针变量
c语言规定一种指针变量可以指向作为二维数组元素的一个一维数组(即二维数组的一行),对这种指针变量进行加减操作则指针将在二维数组中的行上移动。
类型符 (*指针变量名)[指向的一维数组元素的个数]
那么对于一个由2行3列组成的二维数组a[2][3],如果指针变量p指向这个二维数组中包含3个元素的第一行一维数组,则指针变量p的定义和赋值形式如下:
int a[2][3],(*p)[3];
p=a;
此时p指向二维数组a的起始地址。对其进行加法操作时p+1等同于a+1,指向包含3个元素的一维数组a[1].所以*(p+1)等于一维数组名a[1],*(p+1)+1等于a[1]+1,所以*(*(p+1)+1)等于a[1][1].
比较指向数组元素的指针变量和指向数组的指针变量的不同。
#include "stdio.h"
void main()
{
}
二维数组a[m][n]的元素a[i][j]的地址,用指向包含n个元素的一维数组的指针变量p表示形式为:*(p+i)+j,即*(*(p+i)+j)等于a[i][j]的值。
指向数组的指针变量在使用时,要注意与元素是指针类型的指针数组的区别。例如:int(*q)[3],*p[3];
q是指向一个包含3个整型元素的一维数组的指针变量,p是一个由p[0]\p[1]\p[2]共3个指向整型数据的指针组成的一维数组。
指向指针的指针属于“二级间址”,它定义的一般形式为:
类型名
例如: int **p;
表示p是一个指向int 型指针变量的指针。
#include "stdio.h"
void main()
{
}