C语言——数组指针详解,区别于指针数组。

/**
题意 使用指针 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;
}

运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值