C语言程序设计--二维数组与指针

  • 格式:pdf
  • 大小:106.77 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二维数组与指针(教程)

二维数组与指针

1.二维数组元素在内存中的存放方式

在C++中,二维数组元素值在内存中是按行的顺序存放的。若定义二维整型数组a[3][3],假设编译系统为数组a分配的内存空间从1000开始到1035为止,则数组中各元素a[0][0]~a[2][2]在内存中按行存放次序如图7.6所示。因此,与一维数组类似,可用指针变量来访问二维数组元素。

【例7.7】用指针变量输出二维数组各元素的值。

 # include

 void main(void)

 { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

int *p=&a[0][0]; //将二维数组首地址赋给指针变量p

for (int i=0;i<9;i++)

{ cout<<*p<<'\t'; //输出二维数组中第i个元素值

p++; //指针变量p加1,指向下一个元素

}

 }

程序执行后输出结果为:

1 2 3 4 5 6 7 8 9

但要用上述指针变量p访问二维数组中任意指定元素a[i][j]就觉得很不方便,为此C++设计者提供另外几种访问二维数组元素的方法,为了了解访问二维数组元素的方法,必须了解三个地址概念,即:二维数组行首地址、行地址、元素地址,现介绍如下。

2.二维数组行首地址

二维数组各元素按行排列可写成如图7.7所示矩阵形式,若将第i行中的元素a[i][0]、a[i][1]、a[i][2]组成一维数组a[i] (i=0,1,2),则二维数组a[3][3]可看成是由三个一维数组元素a[0]、a[1]、a[2]组成。即:a[3][3]= (a[0],a[1],a[2]),其中:a[0]、a[1]、a[2]是分别表示二维数组a[3][3]的

第0、1、2行元素。

即:a[0]=(a[0][0],a[0][1],a[0][2])

a[1]=(a[1][0],a[1][1],a[1][2])

a[2]=(a[2][0],a[2][1],a[2][2])

因为数组名可用来表示数组的首地址,所以一维数组名a[i]可表示一维数组(a[i][0],a[i][1],a[i][2])的首地址&a[i][0],即可表示第i行元素的首地址。因此,二维数组a中第i行首地址(即第i行第0列元素地址)可用a[i]表示。

由例7.6可知,一维数组的第i个元素地址可表示为:数组名+i。因此一维数组a[i]中第j个元素a[i][j]地址可表示为:a[i]+j ,即:二维数组a 中第i行第j列元素a[i][j]的地址可用a[i]+j来表示,而元素a[i]][j]的值为:*(a[i]+j)。

【例7.8】定义一个3行3列数组,输出每行的首地址及所有元素值。

 # include

 void main(void)

 { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

for (int i=0;i<3;i++)

{ cout<<"a[" <

 }

程序执行后输出:

a[0]=0x0065FDD4=0x0065FDD4

a[0][0]=1=1

a[0][1]=2=2

a[0][2]=3=3

a[1]=0x0065FDE0=0x0065FDE0

a[1][0]=4=4

a[1][1]=5=5

a[1][2]=6=6

a[2]=0x0065FDEC=0x0065FDEC

a[2][0]=7=7

a[2][1]=8=8

a[2][2]=9=9

由此例输出结果可看出a[i]=&a[i][0] (i=0,1,2),这表明a[i]确实可以表示第i行首地址(即第i行第0列地址)&a[i][0]。

读者应注意,由于数组在内存的地址是由操作系统动态分配,因此,实际输出的各行首地址并不会如图7.5所假设的从1000到1035。通常地址用十六进制数表示,如在本例中:第0行实际首地址是:

a[0]=0x0065FDD4。第1行实际首地址是:a[1]=0x0065FDE0。第2行实际首地址是:a[2]=0x0065FDEC。

3.二维数组行地址

为了区别数组指针与指向一维数组的指针,C++引入了行地址的概念,并规定二维数组a中第i行地址用a+i或&a[i]表示,行地址的值与行首地址的值是相同的,即:

a+i=&a[i]=a[i]=&a[i][0]

但两者类型不同,所以行地址a+i与&a[i]只能用于指向一维数组的指针变量,而不能用于普通指针变量,例如:

int a[3][3];

int *p=a+0;

则编译第二条指令时将会出错,编译系统提示用户p与a+0的类型不同。如果要将行地址赋数组指针变量,必须用强制类型转换,如:

int *p=(int *) (a+0);

关于指向一维数组的指针将在后文中介绍。

二维数组名a可用于表示二维数组的首地址,但C++规定该首地址并不是二维数组中第0行第0列的地址(即a≠a[0][0]),而是第0 行的行地址,即a=a+0=&a[0]。

4.二维数组的元素地址与元素值

知道了二维数组的行地址与行首地址后,可以讨论二维数组的元素地址。

因为 a[i]=*&a[i]= *(a+i),所以 *(a+i) 可以表示第 i行的首地址。因此二维数组第i行首地址有三种表示方法:a[i] 、*(a+i)、&a[i][0]。

由此可推知:第i行第j列元素a[i][j]的地址有四种表示方法: