指针数组和数组指针

指针数组和数组指针

先看两者之间的定义

int *p1[5];     //指针数组
int (*p2)[5];   //数组指针

经常有人把两者搞混。我们可以使用符号的优先级来帮助我们理解。在上面第一行代码中。[]的优先级高于*号,所以p1首先是数组,而类型是(int *)也就是一个存放指针的数组。而第二行()的优先级高于[],所以优先申明这是一个指针,然后指向一个大小为5的int数组,5也可以说是p的步长。

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下任何类型的指针永远是占4 个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。

具体情况看下面这段代码

int main()
{
    int a[4][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ,12};

    cout << a << endl;          //输出数组a的地址
    cout << a[1] << endl;       //输出a[1]行的首地址
    cout << a+1 << endl;        //输出a[1]行的首地址
    cout << *(a+1) << endl;     //输出a[1]行的首地址
    cout << (a+1)[1] << endl;   //输出a[2]行的首地址
    cout << a[2] << endl;       //输出a[2]行的首地址
    cout << *(*(a+1)+1) << endl;    // 输出a[1][1]的值
    cout << (*(a+1))[1] << endl;    // 输出a[1][1]的值
    cout << endl;

    int *p1[4];                 //指针数组
    for(int i=0; i<4; ++i)
        p1[i] = a[i];           //从这里可以看出数组元素就是一个指针
    cout << sizeof(p1) << endl; //看下p1的大小,在64位系统一个指针是8个字节
    cout << *(p1[1]+1) << endl << endl;  //访问a[1][1],用法和上面*(*(a+1)+1)有点类似

    int (*p2)[3] = a;           //定义数组指针
    cout << sizeof(p2) << endl; //由于p2是指针,所以是8个字节
    cout << a << endl;          //a的地址
    cout << p2[0] << endl;      //a的地址
    cout << (*p2)[0] << endl;   //a[0][0]
    ++p2;
    cout << (*p2)[0] << endl << endl;   //输出a[1][0]这两行代码也可以看出数组指针为什么被叫做行指针

    return 0;
}

输出结果:

0x7ffe51ef0a50
0x7ffe51ef0a5c
0x7ffe51ef0a5c
0x7ffe51ef0a5c
0x7ffe51ef0a68
0x7ffe51ef0a68
5
5

32
5

8
0x7ffe51ef0a50
0x7ffe51ef0a50
0x7ffe51ef0a5c
0x7ffe51ef0a5c
1
4

0x7ffe51ef0a20
0x7ffe51ef0a20
1
0x7ffe51ef0a24

用下面的图片来描述这两者之间的关系:
在这里插入图片描述

参考文章:数组指针和指针数组的区别

想交流的可以加我公众号:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值