C语言中int (*P)[N]和int *P[N]的区别,以及和二维数组的联系

        在函数传递参数中,原本设想通过一个函数实现打印二维数组,数组为a[M][N],M,N分别为3,4,即3行4列的一个二维数组,函数形参设置为int (*p)[M],此时我的理解是为一个数组,数组元素为int指针,这里犯了错误,在关系结合方面:

(错误示范)

 结合方式从右到左结合,例如

int *p[N]:p先结合[]表示一个数组,再与*结合,即表示一个指针数组(是一个数组)。

int (*p)[N]:p先与*结合,再与[]结合,表示一个指针,指向一个数组元素,是一个数组指针

注意区分两者的区别联系。

        回到问题,为什么int (*p)[M]不行,而int (*p)[N]可行呢?因为a[M][N]是一个三行四列的数组元素,p是一个指向4个元素的指针,把a看成一维的数组,有三个元素,每个元素内又含有四个元素,所以p是需要指向N即4个元素的指针,这样才能装下每个大的”元素“。这与之前的理解是没有出入的,只是对于数组指针与指针数组理解有误。所以才可以数组与指针相互表示:p[][N]可以表示为(*P)[N]。

(正确示范)

        数组化表示P[][N]或者指针化表示(*P)[N],可以说“一个方框代表一个星”,但是数组化表示第二个内容不能省略,因为需要明白指针指向的“小一维数组”到底是多长。

int (*p)[N] //N不能省略,需要明白指向的一维数组到底是多长
int a[][N] //同样的数组表示方法,第二个不能省略

需要弄清楚:

  • 数组指针、指针数组
  • 行指针、列指针

对于二维数组P,行指针是P,可以P+n,依旧是行指针,取*后是其“内容”,也便是列指针。

  • 一维数组、二维数组以及多维数组一维化

错误、不足之处欢迎之处,谢谢!主要为了自己巩固,后续还会补充其他知识

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值