二维数组的指针变量笔记

二维数组的指针变量

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

int main() { static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0];p<a[0]+12;p++) { if((p-a[0])%4==0) printf("\n"); printf("%4d ",*p); } return 0; }


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]不同

int main() { static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int i,j,(*p)[4]; for(p=a,i=0;i<3;i++,p++) for(j=0;j<4;j++) printf("%d ",*(*p+j)); printf("\n"); return 0; }


分析: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值