数组指针与指针数组

依据C++ primer,当指针和数组混在一起的时候,判断定义的到底是什么,主要是依据两大原则:

1.如果定义当中没有小括号,从右往左看。

例如:

int *p[10];

这定义的是个什么东西呢?

从右往左看,首先,看到一个中括号,说明定义的是一个数组。里面写的10,说明这个数组能装10个元素。再往左,看到p,说明数组的名字是p;再往左,看到*,说明数组内的元素是指针;再往左,看到int,说明指针指向的是int。

那么上面定义的是:一个名字叫p的数组,数组内装10个指针,每个指针指向一个int数据。

那么如果单独拿出p来看,p是什么?

p是数组名字,同时也是一个指向数组第一位的指针,而数组第一位装的是一个指向int的指针。

也就是说,p可以理解为一个指针,指向另外一个指针,另外的那个指针指向一个int数据。

因此,可以如下定义:

int **a;
a=p;

a被定义为一个指向指针的指针,它所指向的指针,刚好也指向一个int数据。所以a和p是同一类型,都是一个指针,指向一个“指向int数据的指针”。所以可以把p赋给a。a不能赋给p,因为p同时也是数组名,可以看成一个常量指针,不能被赋值。

2.如果定义中有小括号,先从括号里开始看。

例如:

int (*p)[10];

这时候就不能从右往左看了,应该从括号内开始读。从括号里可以得知,定义的是一个名叫p的指针,指针指向了一个数组的首地址,数组里装的是int型的数据。

因此,可以如下定义:

int a[10][10];
p=a;

定义一个二维数组a,其中a是数组名,也是一个指针,指向a[0][0]到a[0][9]的一个“内层数组”的首地址。内层数组能装10个数,每个是int型数据。

这种情况下,p指向的是一个装了10个int数的数组,a指向的也是一个装了10个int数的数组。a和p是同一类型的数据。所以a可以赋给p,但是p不能赋给a,因为数组名可以看做是指针常量(不可改变地址的指针),不能被赋值。


字符串的指针数组与数组指针是个特例,见:经典奇葩面试题:C++中字符串的数组指针与指针数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值