数组指针和指针数组的区别

文章目录


前言

       这几天老师有问到指针数组和数组指针的区别,当时我就懵了,随即百度了一下,简单记录。

       如有理解不对的地方,请各位大神批评指正,万分感谢。


一、什么是指针数组?

        1.定义

        数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。

        2.声明

#include <stdio.h>

int main(){
    
    char *p[2];      //指针数组
    int *q[2];       //指针数组
    double *r[2];    //指针数组

    retuen 0;
}

        3.指针数组的内存示意图

        如上图所示,可以看出每个数组里面都是由指针组成的,并且每个数组里面的指针都占用相同的空间(32位机为4字节,64位机为8字节)。


二、什么是数组指针?

        1.定义

        指的是数组名的指针,即指向数组首元素地址的指针。即是指向数组的指针

        2.声明

#include <stdio.h>

int main(){
    
    char (*p)[2];      //数组指针
    int (*q)[2];       //数组指针
    double (*r)[2];    //数组指针

    retuen 0;
}

        3.内存示意图 

         如上图所示,数组指针是一个指向数组的指针,它本身也是一个指针,所以固定占用4个字节(64位机占用8字节)。


三、如何区别指针数组和数组指针?

一般区别两者的方式是看最后两字,然后通过两者的性质去联想,我个人判断步骤如下:

1、先看最后两字

        指针数组是一个数组

        数组指针是一个指针

2、联想

        指针数组是数组,那么就是数组里包含指针

        数组指针是指针,那么就是指向数组的指针

面对代码,我们则是用括号的优先级来判断

如果没有小括号,则直接看中括号,为数组,则是指针数组        int *p[2]

如果有个小括号,则优先看小括号,为指针,则是数组指针        int (*p)[2] 


 四、实践理解

#include <stdio.h>
int main(){

    int a = 100, b = 200, c = 300;
    
    int *arr[3] = {&a, &b, &c};    //定义一个指针数组存放a,b,c的地址

    printf("%d %d %d", *arr[0], *arr[1], *arr[2]);    //输出结果:100 200 300
 
    return 0;
}

        如代码所示,int *arr[3] 表示定义以一个长度为3的指针数组,数组里面的每一个指针分别指向a b c。在输出时,可以通俗的将其看成为一个arr[3],再用 * 解引用读出该数组里的指针所指向的值。内存示意图如下图所示。

int main()
{
    char arr[5]={'A','B','C','D','E'};    

    char (*p)[5]=&arr;    //定义一个数组指针
    
    printf("%c %c %c",*(*p+0),*(*p+1),*(*p+2));    //输出:A B C

    return 0;
}

        如代码所示,char (*p)[5] 表示定义一个指针,该指针指向长度为5的数组。在输出时,应该将一整个 *p 看成指针,通过 *(*p+i) 来解引用该地址的值。内存示意图如下。


总结

        一般按照我的两步走方法判断之后,基本上就能够彻底理解两者的区别。如果仍然有理解不足的情况,建议反复多看内存示意图。

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值