指向多维数组的指针变量

上传人:新** 文档编号:504334693 上传时间:2023-11-27 格式:DOCX 页数:6 大小:24.44KB
返回 下载 相关 举报
指向多维数组的指针变量_第1页
第1页 / 共6页
指向多维数组的指针变量_第2页
第2页 / 共6页
指向多维数组的指针变量_第3页
第3页 / 共6页
指向多维数组的指针变量_第4页
第4页 / 共6页
指向多维数组的指针变量_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《指向多维数组的指针变量》由会员分享,可在线阅读,更多相关《指向多维数组的指针变量(6页珍藏版)》请在金锄头文库上搜索。

1、指向多维数组的指针变量1多维数组的指针多维数组可以看作是一维数组的延伸,多维数组的内存单元也是连续的内存单元。换句话说,C语言实际上是把多维数组当成 一维数组来处理的。下面以二维数组为例说明这个概念。比如,现在有一个int型的二维数组a34,计算机认为这是一个一维的数组a3,数组的三个元素分别是a0,a1 和a2。 其中每个元素又是一个一维数组,例如a0又是一个包含a00,a01,a02和 a03共4个元素的数组。如果我们要 引用数组元素a12,可以首先根据下标1找到a1,然后在a1 中找到第3个元素a12。假设数组a的起始地址为FF10, 对应的内存情况如图:DS:FF10 a00DS:FF

2、18 a10DS:FF20 a20DS:FF12 a01DS:FF1A a11DS:FF22 a21DS:FF14 a02DS:FF1C a12DS:FF24 a22DS:FF16 a03DS:FF1E a13DS:FF26 a23a+1DS:FF10倾DDSFF14啊ElDS:FF16啊【3DS:FF18DSFF1ADMFFmDSFFlEualOMU1Ual3RDS;FF20DS;FF22DSFF 新犯I间咐【1M22钺 23叩四*al 一a2 -*曲口 1织+1 f阳1a2+l ,圣田1*al+2 +犯时a2+2 +织1啊1屯+3 土a2+3 士可邛1-1-二 Ja0aORla0+2a0+

3、5可以看到,二维数组a34的12个元素在内存中是顺序排列的,因此&a00是数组第一个元素的地址,为FF10。a00,a01 这些数组元素都有具体的内存单元值。但是,a0,a1和 a2这三个数组元素不占用内存单元,它们只是代 号(其实就是一个指针常量),是虚拟的东西。a0本身又是一个数组,包含a00,a01,a02和 a03,那么a0 作为数组名称,按照。语言的语法,a0就是数组首地址,也就是数组第一个元素的地址,即a00的地址FF10。同理,a1 是第一个元素a10的地址,即FF18 ; a2是第一个元素a20的地址,即FF20。相对于a0,a1 和a2来说,a也是数组的名称,是数组的首地址,

4、即FF10。a是指向数组首地址的指针,a + 1代表什么? a是数组名称,a0,a1和 a2是元素,那么a + 1就是&a1(如果一个一维数组intb3,那么b+1是不是&b1 ?),即 第二行元素的首地址,指针值为FF18。同理,a+2就是&a2,指针值为FF20。也可以换个角度去理解。a是数组首地址,指向二维数组第一行的首地址;计算a + 1时,指针a跳过的是整个a0,a + 1指向 二维数组第二行的首地址。指针a在做加法时,跳过的是一行元素。a1 + 1代表什么?指针a1 是一维数组a1 中第一个元素a10的地址FF18。对于一维数组a1 来说,指针a1 + 1指向了 a1中第二个元素a

5、11 的地址,即FF1A。这里指针加法的单位是一列,每次跳过a1中的一个数组元素。*a代表什么? *a也就是*(a+0),数组第一个元素的值,即a0。前面讲过,a0是一个代号,它不是一个具体元素的值,而是 内嵌的一维数组a0的名字,a0本身也是一个指针值。同理,*(a + 1 )就是a1,*(a+2)就是a2。如果要访问二维数组里第i行第j列的某个元素,可以直接引用ai-1j-1,也可以使用指针的方法。指向第i行第j列元素的 指针为ai+j,或者*(a + i)+j,因此,间接用指针引用二维数组里第i行第j列的某个元素,可以表示为*(ai+j)或者*(*(a+i)+j)。 特别需要指出的是,a

6、i不是一个具体的数组元素,它是一个代号,实际上是一个指针值,代表i+1行里中第一个元素的首地址。 因此&ai不能直接理解为ai的物理地址,ai不是变量,不存在物理地址;&ai代表第i+1行的行指针值,和a + i等价。 同样,*ai也不能理解为对一个数组元素进行指针运算符操作。ai是一个指针值,是i+1行中第一个元素的首地址,那么*ai 就是i+1行里中第一个元素的值,即ai0。总之,二维数组aij的指针由于出现了虚拟的ai这个概念,所以对于初学者很不好理解,请读者仔细消化理解。下表是上述 概念的综合:*形式含义a二维数组名称,数蛆首地址a+is 血l第iN行的首地址如 L Wh)第iH行,第

7、1列元素的首地址迎町擀十i)十L铜响第i+1行,第什1列元素的首地址建顺柘i第iH行,第1列元素的值第iH行第什1列元素的值main()inta34=12345,6,7,8910,11,12,i,j;/*打印a*/printf(na=%X,a);/*打印 a+i,&ai*/for(i=0;i3;i+)printf(na+%d=%X,&a%d=%X,i,a + i,i,&ai);/*打印 ai,*(a+i)*/for(i=0;i3;i+)printf(na%d=%X,*(a+%d)=%X,i,ai,i,*(a + i);/*打印 ai+j,*(a+i)+j,&aij*/for(i=0;i3;i+

8、)for(j=0;j4;j+)printf(na%d+%d=%X,*(a+%d)+%d=%X,&a%d%d=%X, i,j,ai+j,i,j,*(a + i)+j,i,j,&aij);/* 打印 *(a + i),*ai*/for(i=0;i3;i+)printf(n*(a+%d)=%X,*a%d=%X,i,*(a + i),i,*ai);/* 打印 *(ai+j),*(*(a + i)+j),aij*/for(i=0;i3;i+)for(j=0;j4;j+)printf(na%d+%d=%d,*(a+%d)+%d=%d,&a%d%d=%d,i,j,*(ai+j),i,j,*(*(a + i)

9、+j)而aij);程序运行的结果为(打印的地址值是动态分配的,不同环境下可能不同;但数组的地址偏移量是相同的):a=FFBEa+0=FFBE,&a0 = FFBEa + 1=FFC6,&a1 = FFC6a+2 = FFCE,&a2 = FFCEa0 = FFBE,*(a+0) = FFBEa1 = FFC6,*(a + 1) = FFC6a2 = FFCE,*(a+2) = FFCEa0+0=FFBE,*(a+0)+0=FFBE,&a00 = FFBEa0 + 1=FFC0,*(a+0) + 1=FFC0,&a01 = FFC0a0+2=FFC2,*(a+0)+2 = FFC2,&a02 =

10、 FFC2a0 + 3 = FFC4,*(a+0)+3 = FFC4,&a03 = FFC4a1+0=FFC6,*(a + 1)+0=FFC6,&a10 = FFC6a1 + 1=FFC8,*(a + 1) + 1=FFC8,&a11 = FFC8a1+2=FFCA,*(a + 1)+2 = FFCA,&a12 = FFCAa1 + 3 = FFCC,*(a + 1)+3 = FFCC,&a13 = FFCCa2+0=FFCE,*(a+2)+0=FFCE,&a20 = FFCEa2 + 1=FFD0,*(a+2) + 1=FFD0,&a21 = FFD0a2+2=FFD2,*(a+2)+2 =

11、 FFD2,&a22 = FFD2a2 + 3 = FFD4,*(a+2)+3 = FFD4,&a23 = FFD4*(a+0) = 1,*a0 = 1*(a + 1)=5,*a1=5*(a+2)=9,*a2=9a0+0=1,*(a+0)+0=1,&a00 = 1a0 + 1=2,*(a+0) + 1=2,&a01=2a0+2=3,*(a+0)+2=3,&a02=3a0 + 3=4,*(a+0) + 3=4,&a03=4a1+0=5,*(a + 1)+0=5,&a10=5a1 + 1=6,*(a + 1) + 1=6,&a11=6a1+2=7,*(a + 1)+2=7,&a12=7a1+3=8

12、,*(a + 1)+3=8,&a13=8a2+0=9,*(a+2)+0=9,&a20=9a2 + 1=10,*(a+2) + 1=10,&a21 = 10a2+2=11,*(a+2)+2=11,&a22 = 11a2+3=12,*(a+2)+3=12,&a23 = 12从输出的结果可以看到,&ai和ai的输出值都是一样的。第i+1行的首地址是FFBE,第i+1行、第1列元素的首地址也是 FFBE,这并不矛盾,因为二者都是一个指针值。但是,二者的含义是截然不同的,指针加法的偏移量也是不同的:前者加1指 针跳到下一行;后者加1指针跳到下一列。2指向多维数组的指针变量可以定义指针变量,指向多维数组及

13、其元素。下面仍以二维数组为例进行说明。二维数组在内存中是连续的内存单元,我们可以定义一个指向内存单元起始地址的指针变量,然后依次拨动指针,这样就可以 遍历二维数组的所有元素。例如: main()floata23=1.0,2.0,3.0,4.0,5.0,6.0,*p;inti;for(p=*a;p*a+2*3;p+)printf(n%f,*p);结果输出:1.0000002.0000003.0000004.0000005.0000006.000000在上述例子中,定义了一个指向float型变量的指针变量。语句p=*a将数组第1行,第1列元素的地址赋给了 p,p指向了二 维数组第一个元素a00的地址。根据p的定义,指针p的加法运算单位正好是二维数组一个元素的长度,因此语句p+使 得p每次指向了二维数组的下一个元素,*p对应该元素的值。根据二维数组在内存中存放的规律,我们也可以用下面的程序找到二维数组元素的值:main()floata23=1.0,2.0,3.0,4.0,5.0,6.0,*p;in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号