文章目录
   
    
    
    前言
   
这几天老师有问到指针数组和数组指针的区别,当时我就懵了,随即百度了一下,简单记录。
如有理解不对的地方,请各位大神批评指正,万分感谢。
    
    
    一、什么是指针数组?
   
    
     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) 来解引用该地址的值。内存示意图如下。
     
   
    总结
   
一般按照我的两步走方法判断之后,基本上就能够彻底理解两者的区别。如果仍然有理解不足的情况,建议反复多看内存示意图。
 
