多维数组与指针
1、多维数组元素的地址;
多维数组也可以称之为数组的数组,其元素均为数组,如有一个二维数组:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};,它有三个元素:a[0],a[1],a[2],每一个元素又都是一个一维数组,分别包含4个元素,因此,a是由3个一维数组(分别是a[0],a[1],a[2])组成的数组。
已经知道,C++中,数组名代表的是此数组的首元素地址,但在int a[3][4]中,a代表的是a数组第一个元素a[0]的地址,注意,a的首元素不是一个整型变量,而是一个一维数组,如果a数组的起始地址为2000,则a=2000,a+1=2016,a+2=2032,
同样,数组名代表的是此数组的首元素地址,a数组中,a[0]是一个一维数组,a[0]即是此一维数组的首元素地址,即a[0]=&a[0][0]; a[0]+1=&a[0][1]; a[0]+2=&a[0][2]; a[0]+3=&a[0][3],a[1],a[2]同样如此。
因此,如要知道a[1][2]的值,可这样表示:*(a[1]+2) ,而a[1]又与*(a+1)无条件等价,因此,*(a[1]+2)=*(*(a+1)+2) ,由此可知,二维数组a中,若需得出a[i][j]的值,可以表示为:*(*(a+i)+j)。
2、指向多维数组的指针变量:
如一、遍历 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}的值。
#include
using namespace std;
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for(int* p=a[0];p
cout
cout
return 0;
}
由于无论是一维数组,还是多维数组,在内存中均是按线性排列存放的,因此使指针变量p指向a[0]的首元素地址,依次循环输出。如图:
a[0][0] 1←p=a[0]
a[0][1] 2 ←p+1
a[0][2] 3 ←p+2
a[0][3] 4 ←p+3
a[1][0] 5 ←p+4
a[1][1] 6
a[1][2] 7
a[1][3] 8
a[2][0] 9
a[2][1] 10
a[2][2] 11
a[2][3] 12 ←p+11
上例的指针变量为指向多维数元素,还可以让指针指向一个包含n个元素的数组。
如二、输一个二维数组任一行,任一列的值。
#include
using namespace std;
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int i,j;
cin>>i>>j;
int (*p)[4];// 定义一个指针变量,此指针指向一个包含4个整型元素的一维数组。
p=a; //便p指向a[0];
if(i>=3 || j>=4)
cout
else
cout
return 0;
}
3、用指向数组的指针作函数参数:
如例一,用函数调用实现:
#include
using namespace std;
int main()
{
void output(int (*p)[4]);
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
output(a);
return 0;
}
void output(int(*p)[4]) //注意实参形参的类型匹配
{
for(int i=0;i
for(int j=0;j
cout
cout
}