/**
题意 使用指针 p 和prt 表示a[1][2];
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(){
int a[4][3] = {0,1,2,3,4,5,6,7,8,9,10,11};
int (*prt)[3] =a; ///不等于*prt[4],意义不同,用法相同
int *t[4];///指针数组,即声明了4个指针,要for循环初始化分别指向a[i]
int *p = a[0];
// cout<< *((*prt +1)[2]);///A选项
cout<< (*prt +1)[2] <<" "<<&a[1][0];///修改后的 A :输出3,是a[1][0]
///*prt表示a[0] ,*prt+1表示&a[0][1], [2]表示+2个前面的单位,然后取值,表示加两列小单位所以*(&a[0][1]+2) = a[1][0]
/**
下面解释一下加前面的单位的具体含义
由于[]优先级高于* 所以未打小括号的时候,会先根据前面的单位 +x 然后再取值。
**/
cout<<endl<<*(prt+1)[2];///*(prt+1) 表示a[1],[2]表示+2个前面的单位,然后取值,故*(prt+1)[2] 表示加两行 =a[2][0];
cout<<endl<<*prt[2];///输出的是a[2][0],该单位是属于大单位。未打括号,先+两行,再取值
cout<<endl<< (*(prt+1))[2];///输出的是a[1][2],属于小单位。打了括号,先得到了&a[1],再加2个小单位
cout<<endl<<"-------------------------"<<endl;
//cout<<endl<<*(*(p+5));///B选项 *(5)不允许
cout<<endl<<*(p+5);///修改后的B:输出a[1][2]
cout<<endl<<"-------------------------"<<endl;
cout<<endl<<(*prt+1)+2;///C选项 输出的是a[1][0]的地址。等价于&a[0]+1+2 = &a[1][2]
cout<<endl<<"-------------------------"<<endl;
cout<<endl<<*(*(a+1) +2);///D 对的
cout<<endl<<"-------------------------"<<endl;
cout<<endl<<"a[0]: "<<a[0]<<endl;
cout<<"*(prt+1): "<<*(prt+1) <<" a[1]: "<<a[1]<<endl;
cout<<"*prt+1: "<<(*prt)+1<<" &a[0][1]: "<<&a[0][1];
cout<<endl<<"&a[1][2]: "<<&a[1][2];
return 0;
}
运行结果