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

  • Post author:
  • Post category:其他


文章目录




前言

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

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




一、什么是指针数组?


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) 来解引用该地址的值。内存示意图如下。


总结

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



版权声明:本文为EgBerT0o0原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。