爱奇艺笔试题

#include<iostream>
using namespace std;


int main(){
    int a[2][3]={10,20,30,40,50,60};
    int (*p)[3];
    p=a;
    cout<<p[0][0]<<endl<<*(p[0]+1)<<endl<<(*p)[2]<<endl;
}
output:10 20 30

int (*p)[3]: 是个指针,它指向有3个int元素的一维数组,(p+1)会跳3个数组元素

p[0][0]: 表示a[0][0]

*(p[0]+1): 表示a[0][1]

(*p)[2]: 表示a[0][2]

理解一下:p是指向2行3列二维数组的首地址

p[0]代表首地址,+1,就变成第一行第二个元素的地址,所以解引用*(p[0]+1)就得到a[0][1]

(*p)[2]=a[0][2],着重说明一下原因:

先看一下(*)间接寻址运算符,微软官方文档这么说:

间接寻址运算符 (*) 通过指针间接访问一个值。 操作数必须是一个指针值。 操作的结果是操作数所寻址的值;即其操作数指向的地址处的值。 
结果的类型是操作数寻址的类型。
如果操作数指向函数,则结果是函数指示符。 如果它指向存储位置,则结果是指定存储位置的左值

所以(*p)运算结果是一个对象变量,这里很容易理解出来就是指向a数组的一个指针变量(左值)(它的值可以理解为数组标识符a里存的地址),到这里我们再看一下下标运算符[]:

postfix-expression [ expression ] 
通常,postfix-expression 表示的值是一个指针值(如数组标识符),expression 是一个整数值(包括枚举类型)。 
但是,从语法上来说,只需要一个表达式是指针类型,另一个表达式是整型。 
因此整数值可以位于 postfix-expression 位置,指针值可以位于 expression 的方括号中或下标位置.
下标表达式 e1[ e2 ] 的结果由以下所示给定:
*( ( e2 ) + (e1) )
该表达式生成的地址不是 e1 地址中的 e2 字节。 相反,该地址将进行缩放以生成数组 e2 中的下一个对象。

这样就能理解(*p)[2]==a[0][2]

同理(*p)[3]==a[1][0],相当于找连续内存空间里面的第四个对象







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值