绕口令:指向数组的指针的数组

今天看《征服C指针》这本书的时候看到一个非常有趣的声明:

double (*polylines[5])[2];

按原来作者讲的读C声明方法,还是可以比较轻松的了解到这是一个指向double数组(2个元素)的指针的数组(5个元素)。
虽然文字上的意思是读出来了,但是对于本人作为一个C初学者来说,如何转化成对代码的认知还是有一定的难度的,尤其是如何给这个指针数组赋值困扰到了我。不过其实仔细分析下还是非常容易明白的,那么从最简单的入手来认识这个“绕口令”:

  • 它是个指针数组。

指向数组的指针的数组,那么本质上就是个数组,数组里的元素是指针,指向一个double类型含有两个元素的数组。那么从内向外开始,一步一步的来引导出这个指针数组所需要的函数:

  • 指向的是一个double类型数组,含有两个元素。
    double a[2] ={1,5} ;
    double b[2] ={10,15};
    double c[2] ={20,25};
  • 数组中每一个元素指向的是一个数组而非单个double类型元素,所以需要用&。

double (*polylines[3])[2]={&a,&b,&c};//5个指针有点多,我简化了一下方便自己。 

一切都看起来合乎逻辑,那么如何验证呢?当然是打印出他的值。因为是一维数组,polylines是数组首元素地址:
那么先解引用*polylines->&a,找到第一个指针a所指向的地址。切记在这里a指向的是一个数组不是一个元素。再进行解引用,**polylines->a[0][0],这是a指向的第一个数组的首元素地址,虽然a仅仅指向了一个数组,但是不能忘记a依然是一个数组指针(行指针)。再对上面的结果解引用,才是具体的值。也就是说,一个指向数组的指针的数组本质上,是一个披着一维外皮的“三维”数组。

    printf("%d\n",polylines[1][0][1]);//15
    printf("%d\n",*(*polylines[1]+1));//15
    printf("%d\n",*(*(*(polylines+1)+0)+1));//15

本人在研究的时候,先是找到了第二种打印方法,才恍然大悟这是一个“三维”的数组,这个绕口令真是十分有趣。也就是类似:
{
{ {1,5} }
{ {10,15} }
{ {20,25} }
}
这样的一个数组。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值