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