二维数组的指针变量笔记

二维数组的指针变量

------指向二维数组元素的指针变量


debug看看。

看看图上几个地址都是一样。

p=a时为什么会报错呢?

errorC2440:'=':cannotconvertfrom'int[3][4]'to'int*'

分析一下:

二维数组,可以理解为一维数组的嵌套。

a是一个一维数组,包括a[0],a[1],a[2]3个元素

而元素a[0]又是一个一维数组,包括a[0][0],a[0][1],a[0][2],a[0][3]

同理,a[1],a[2]也是一维数组

a[0]a[0][0],a[0][1],a[0][2],a[0][3]的数组名,数组名是数组首元素的地址

所以a[0]a[0][0]的地址,同理a[1]a[1][0]的地址,a[2]a[2][0]的地址。

再同理,aa[0],a[1],a[2]的数组名,所以数组名a是首元素a[0]的地址。

所以,a的地址和a[0],a[0][0]的地址都是一样的。

但是a是一个有三个元素的数组,它这三个单元里存放着一个有四个元素的一维数组,p=a就是让一个指向int型的指针变量指向int[4]这个数组了(且把int[4]看成一种类型)。错在这里。

改一下。int(*pi)[4]=a;

也可以把a地址的变量类型转换成int

p=(int*)a;

就不会报错了。

所以:

p=*a;//

p=&a[0][0];//

p=(int*)a;//

p=a;//

-------指向一维数组的指针变量

定义形式:数据类型(*指针名)[一维数组维数];

int(*p)[4];//p的值是一维数组的首地址,p是行指针

可让p指向二维数组某一行

inta[3][4],(*p)[4]=a;//注意一维数组指针变量维数和二维数组列数必须相同 //()不能少,[]优先级比*

//int(*p)[4]int*p[4]不同


分析:p是指向一个有4个元素的一维数组的指针变量

p=a[0];//a[0]a[0][0]的地址,a[0][0]int型的

p=*a;//*a是第0行第0列元素的地址,这元素是int型的

p=&a[0][0];//&a[0][0]地址的变量类型是int

p=&a[0];//a[0]a的首元素,它的地址就和a是一样的,a[0]里存放的就是int[4]

表示形式

含义

地址

a

二维数组名,数组首地址

2000

a[0],*(a+0),*a

0行第0列元素地址

2000

a+1,&a[i]

1行首地址

2008

a[1],*(a+1)

1行第0列元素地址

2008

*(a[1]+0),*(*(a+1)+0),a[1][0]

1行第0列元素值

11

a[1]+2,*(a+1)+2,&a[1][2]

1行第2列元素地址

2012

*(a[1]+2),*(*(a+1)+2),a[1][2]

1行第2列元素值

14

定义array[i][j]

则有

访问二维数组元素

第一种方式:*(array[i]+j)

第二种方式:*(*(array+i)+j)

访问第i行首地址:array+i

访问第i行第j列元素地址:*(array+i)+j

你可能感兴趣的:(二维数组)