爱奇艺笔试题

#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],相当于找连续内存空间里面的第四个对象







猜你喜欢

转载自blog.csdn.net/liunan199481/article/details/80012056