首页 > 学院 > 开发设计 > 正文

多维数组和指针

2019-11-08 00:48:09
字体:
来源:转载
供稿:网友

多维数组和指针

int  a[3][4] ={{},{},{}};

二维数组a是由3个一维数组组成的;

从二维数组角度看,a代表二维数组首元素的地址,此元素不是一个简单的整型元素,而是4个整型元素所组成的一维数组;

a代表首行的首地址       a+1代表第一行的首地址

a[0]、a[1]、a[2]为一位数组名

a[0]代表一维数组a[0]中第0列元素的地址,即&a[0][0];a[1]的值是&a[1][0]; a[2]的值是&a[2][0];

a[0]+0=&a[0][0]=*(a+0)+0;

a[0]+1=&a[0][1]=*(a+0)+1;

a[0]+2=&a[0][2]=*(a+0)+2;

a[0]+3=&a[0][2]=*(a+0)+3;

 

a[i]从形式上看是a数组中序号为i的元素。如果a是一维数组名,则a[i]代表a数组中序号为i的元素所占的内存单元的内容,a[i]是有物理地址的,是占内存单元的;

若a是二维数组名,则a[i]代表一维数组名,他只是一个地址,并不代表某一元素的值(如同一维数组名只是一个指针常量一样)。a、a+i、a[i]、*(a+i)、*(a+i)+j、a[i]+j都是地址,而*(a[i]+j)和*(*(a+i)+j)是二维数组元素a[i][j]值

a               二维数组名,指向一维数组a[0],即0行首地址

a[0],*(a+0),*a            0行0列元素的地址

a+1,&a[1]         1行首地址

a[1],*(a+1)               1行0列元素a[1][0]的地址

a[1]+2,*(a+1)+2,&a[1][2]     1行2列元素a[1][2]的地址

*(a[1]+2)、*(*(a+1)+2)、a[1][2]         1行2列元素a[1][2]的值

 

a+1和*(a+1)地址都是一样的,为何?

首先a+1是二维数组a中序号为1的行的首地址,而*(a+1)并不是a+1单元的内容,因为a+1并不是一个变量的存储单元,*(a+1)也就是a[1],而a[1]是一维数组名,所以也是地址,他指向a[1][0]

a+1与a[0]+1是不同的

a+1是序号为1 的行的首地址,a+1指向序号为1的行,而*(a+1)或a[1]或a[1]+0都是指向1行0列元素,二者虽地址相同,但含义不同。

a、a[0]的值虽然相同,但是由于指针类型不同(a是指向一维数组,a[0]指向a[0][0]元素),因此对指针的加1运算,得到的结果也不同

二维数组名(如a)指向行,因此a+1中的“1”代表一行中全部元素所占的字节数。

一维数组名(如a[0]、a[1])是指向列元素的,a[0]+1中的“1”代表一个元素所占的字节数。

在指向行的指针前面加一个*,就转换为指向列的指针。

反之,在指向列的指针前面加&,就成为指向行的指针

在二维数组中,不要把&a[i]理解为a[i]单元的物理地址,因为并不存在a[i]这样一个实际变量,*(a+i)只是a[i]另一种表现形式,不要简单的认为*(a+i)是“a+i所指单元的内容”。在一维数组中a+i所指的是一个数组元素的存储单元,在该单元中有具体值,而对二维数组,a+i不是指向具体存储单元而是指向行,在二维数组中,a+i、a[i]、*(a+i)、&a[i]、&a[i][0]的值相等,即他们表示同一个地址。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表