分享

多维数组与指针

 小雨伞^.^ 2010-11-11

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<iostream>
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<a[0]+12;p++)
   cout<<*p<<" ";
 cout<<endl;
 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<iostream>
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<<"input error!"<<endl;
 else
   cout<<*(*(p+i)+j)<<endl;
 return 0; 
}

 

3、用指向数组的指针作函数参数:
    如例一,用函数调用实现:
#include<iostream>
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<3;i++)
  for(int j=0;j<4;j++)
   cout<<*(*(p+i)+j)<<" ";
 cout<<endl;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多