C/C++ 二维数组与指针
来源:互联网 发布:python接收命令行参数 编辑:程序博客网 时间:2024/06/03 21:27
1.二维数组元素在内存中的存放方式
在C++中,二维数组元素值在内存中是按行的顺序存放的。
用指针变量输出二维数组各元素的值。
#include <iostream.h>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.二维数组行首地址
二维数组各元素按行排列可写成矩阵形式,若将第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]表示。
一维数组的第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)。
定义一个3行3列数组,输出每行的首地址及所有元素值。
# include <iostream.h> 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[" << i << "]=" << a[i] << "=" << &a[i][0]<< endl; for (int j=0; j<3; j++) cout << "a[" << i << "][" << j << "]=" << *(a[i]+j) << "=" << a[i][j]<< endl; } }
程序执行后输出:
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]。
通常地址用十六进制数表示,如在本例中:第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行行地址 a+i、&a[i]
第i行首地址(第i行第0列地址) a[i]、 *(a+i)、 &a[i][0]
元素a[i][j]的地址 a[i]+j 、*(a+i)+j 、&a[i][0]+j、&a[i][j]
第i行第j列元素值 (a[i]+j) 、 ((a+i)+j) 、 (&a[i][0]+j)、a[i][j]
定义二维数组a[3][3],用二种方式输出行地址,用三种方式输出行首地址,用四种方式输出所有元素地址及元素值。
# include <iostream.h> void main(){ int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; for (int i=0 ;i<3; i++) { cout << "&a[" << i << "]=" << &a[i] << "=" << a+i << endl; //输出第i行行地址 cout << "a[" << i << "]=" << a[i] << "=" << *(a+i) << "=" << &a[i][0] << endl; //行首地址 for (int j=0; j<3; j++) { cout << "&a[" << i << "][" << j << "]=" << a[i]+j << "=" << *(a+i)+j << "=" << &a[i][0]+j << "=" << &a[i][j] << endl; //输出元素a[i][j]的地址 cout << "a[" << i << "][" << j << "]=" << *(a[i]+j) << "=" << *(*(a+i)+j) << "=" << *(&a[i][0]+j) << "=" << a[i][j] << endl; //输出元素a[i][j]的值 } } }
程序执行后输出结果为:
&a[0]= 0x0065FDD4=0x0065FDD4
a[0]= 0x0065FDD4=0x0065FDD4=0x0065FDD4
&a[0][0]= 0x0065FDD4=0x0065FDD4=0x0065FDD4=0x0065FDD4
a[0][0]=1=1=1=1
&a[0][1]= 0x0065FDD8=0x0065FDD8=0x0065FDD8=0x0065FDD8
a[0][1]=2=2=2=2
&a[0][2]= 0x0065FDDC=0x0065FDDC=0x0065FDDC=0x0065FDDC
a[0][2]=3=3=3=3
&a[1]= 0x0065FDE0=0x0065FDE0
a[1]= 0x0065FDE0=0x0065FDE0=0x0065FDE0
&a[1][0]= 0x0065FDE0=0x0065FDE0=0x0065FDE0=0x0065FDE0
a[1][0]=4=4=4=4
&a[1][1]= 0x0065FDE4=0x0065FDE4=0x0065FDE4=0x0065FDE4
a[1][1]=5=5=5=5
&a[1][2]= 0x0065FDE8=0x0065FDE8=0x0065FDE8=0x0065FDE8
a[1][2]=6=6=6=6
&a[2]= 0x0065FDEC=0x0065FDEC
a[2]= 0x0065FDEC=0x0065FDEC=0x0065FDEC
&a[2][0]= 0x0065FDEC=0x0065FDEC=0x0065FDEC=0x0065FDEC
a[2][0]=7=7=7=7
&a[2][1]= 0x0065FDF0=0x0065FDF0=0x0065FDF0=0x0065FDF0
a[2][1]=8=8=8=8
&a[2][2]= 0x0065FDF4=0x0065FDF4=0x0065FDF4=0x0065FDF4
a[2][2]=9=9=9=9
- [C]二维数组与指针
- C指针与二维数组
- C 指针与二维数组
- c语言二维数组与指针
- C 二维数组与指针的关系
- c语言二维数组与指针
- C语言指针与二维数组
- C语言中的二维数组与指针
- C语言指针与二维数组
- c语言二维数组与指针
- C-035.指针与二维数组
- C语言二维数组与指针
- C语言--二维数组与指针浅谈
- C语言指针与二维数组
- C语言指针与二维数组
- C语言指针与二维数组
- C语言二维数组与指针
- 104 C语言指针与二维数组
- jQuery事件-div的显示隐藏及鼠标的移入移出http://www.cnblogs.com/liuyanmin/p/5146544.html
- centos 安装curl
- 入门demo---Mybatis学习笔记(三)
- 第二课断链隐藏驱动
- Java笔记:类和对象
- C/C++ 二维数组与指针
- 2017-08-16学习随笔之Struts1-2
- 对称密码 之 分组密码与数据加密标准
- hdu=1003 Max Sum
- Android 原生系统,手机rom下载网站
- tiaotiaoxuanxuan
- POJ 3687 Labeling Balls (逆向拓扑排序)
- 二十三种设计模式之解释器模式
- HDU-1255 覆盖的面积(线段树扫描线模板+离散化+加点修改题)