指针数组和数组指针

一:数组的简介

二:什么是指针数组

三:什么是数组指针

一:数组的简介

为了大家能更好的理解下面指针和数组的关系,先简要的介绍一下数组。 

创建一个数组arr,它有10个元素,每个元素的类型是int,当把数组名当做函数参数进行传参时,实际上传递的是首元素的地址,等同于&arr[0];那么就有了疑问,&arr呢?这也表示首元素地址吗?

从上图输出我们可以看到它们的地址都是一样的,也就是说都为首元素地址;接下来试着把每个地址+1,因为数组每个元素类型是int,arr表示首元素地址的话它的类型是int*,指针+1跳过的是4/8个字节,接下来看看结果是否一致

可以看出arr和&arr[0]+1确实是跳过了4个字节,&arr跳过的是十六进制的0x28换算成十进制为整个数组大小40(数组10个元素每个元素int,大小为40),所以&数组名,表示整个数组的地址。

总结得:数组名表示首元素地址,但有两个例外:

1.&数组名,表示整个数组的地址;

2.sizeof (数组名)表示整个数组

二:什么是指针数组

数组是可以通过指针来访问,指针是用来存放地址的。定义个数组arr,当我们把arr赋给一个变量p,那p必须得是一个指针类型才能存放地址;*表示p是一个指针,int是因为数组是int型所以p也得是int。

一个地址需要一个指针变量存放,当把多个地址存放在一起用指针数组,数组类型为int*指针,数组里放变量的地址,例如:

int arr[10];存放整型的数组;

char arr[10];存放字符的数组

所以:存放指针的数组称为指针数组;首先是数组(把多个数组地址存放在一起),p先与[10]结合—>是个数组,数组里面是多个int型的地址所以用int*指针

三:什么是数组指针

重点它是个指针—>指向数组的指针,例如:

整型指针—>指向整型的指针

字符指针—>指向字符类型的指针

既然是指向数组的指针,那得有数组地址吧,还记得我一开头就强调的&arr吗?这就是一个数组地址,要将它存起来得用一个指针,先看图

因为&arr是整个数组的地址,所以要存放它得先是个指针—>(*p)【请回想一下我前面提到的】*的作用就是个指针标志,当p加是*就表示p为指针了;又因为arr数组有10个元素,每个元素是int,所以也就写成int(*p)[10]中文意思就是:它是个指针—>指向数组的指针

随堂提问一下:如果数组改为char arr[10];那&arr要用什么样的类型存起来呢?我相信你肯定一下就写出了正确答案。

那么肯定也有人想:int(*p)[10]中一定要加()?答案是:必须!肯定!如果不加()那么p就先与[10]结合了,不就变成指针数组了吗?这怎么行,记住!我们的目的是存放整个数组地址,那它得先是个指针。

有人可能会觉得比较绕,慢慢来多看几遍,要搞清楚指针数组和数组指针的概念,先与[]还是(*)相结合。

言已尽,希望这篇文章能帮助到大家理解指针,哪怕只有万分之一。若文中有什么不详细或错误的地方,还请各位老师指出,相互学习。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值