目录
一、指针和数组
指针与数组,听起来是两个不同的东西,实际上联系紧密。
看下面一段代码:
看看具体含义:
pa: 数组首元素的地址
a: 数组名
&a: 数组的地址
显然,数组名就是首元素地址,数组名就是首元素地址,数组名就是首元素地址
这一点十分重要,在函数传参时经常使用!
关于&a,值虽然都是一样的,但是意义完全不同,后面的指针合集会讲,暂时只需要知道前面两个
关于数组名是首元素地址的印证:
解引用首元素即可
看看内存分布
用指针接收数组名的用法:
-----在这里我们知道数组名是首元素的地址----
那么是地址肯定可以寻址访问,也就是解引用.
( 0x00000000一般不能访问,也就是空指针)
a[0] 访问第一个元素
a[1] 访问第二个元素
······
a[4] 访问第五个元素
很普通的用法
怎样通过指针的方式访问数组的元素?
#include<stdio.h>
int main()
{
int a[5] = { 0,1,2,3,4 };
printf("%d\n", a[1]);//等于什么?
printf("%d\n", *(a+1));//等于什么?
return 0;
}
a[1]==*(a+1)
推广:
a[n]==*(a+n)
这就是通过指针访问数组的方式
中规中矩,
等同于
---------知道了通过指针访问数组---
其实讲到这就差不多了,但还可以再深入一点,毕竟指针水深啊
*(a+i)为什么等于a[i]
也就是 指针+-整数 的原理,不懂得可以跳转:https://blog.csdn.net/m0_53005929/article/details/117527610?spm=1001.2014.3001.5501
整型指针,+1,跳过一个整型
所以a+i 就等同于指针跳过 i个元素,指向第i个元素
以 a+2为例
附上每个元素的地址:.
(整型四个字节,跳过一个整型元素==地址+4)
二、一级指针与二级指针
怎么存放pa的地址?
提取概要:怎么存一级指针的地址?
此时就要引入二级指针了
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;//二级指针
printf("%p\n", ppa);
return 0;
}
ppa就是指针变量名pa的地址
与一级指针的差别就是多了一个*,但是存的都是地址,自然也可以访问
question 1:
如何通过二级指针访问一级指针的内容(通过ppa访问pa的内容)
由于ppa指向pa,要访问pa只要解引用就可
question 2:
如何通过二级指针访问一级指针指向的内容(通过ppa访问a的内容)
由于ppa指向pa,pa指向a
*ppa==pa *pa==a 故 * (*ppa)==a==**ppa
所以先通过ppa访问pa,再通过pa访问a
第三第四种写法相同,第四种更为常见
-------知道了二级指针是什么
-------能通过二级指针访问一级指针
-------能通过二级指针访问一级指针指向的东西
三、指针数组
指针和数组连一起了
那指针数组是指针还是数组?
指针数组是数组,不是指针
整型数组 是一个数组,数组里放的是整型
字符数组 是一个数组,数组里放的是数组
结构体数组 是一个数组,数组里放的是结构体
···
指针数组 是一个数组,数组里放的是指针
这点很重要,后面指针进阶还有个东西叫做 数组指针...
先看如何定义
int* arr[3]
分三部分看;
int* arr [3]
arr是一个数组名,[] 比 * 的优先级高,所以arr先与[]结合
与[]结合自然就是数组了,数组里元素的类型:int *
合起来:arr是一个数组,数组里放的是指针,指针类型是int*
类比 int a[3]
a是数组名,与[]结合,说明是一个数组
把数组名和 [] 去掉,剩下的就是元素类型了,
所以a是一个数组,数组有三个元素,每个元素的类型是int
----知道如何声明指针数组,知道里面放的是什么
int* arr[3] = { &a, &b, &c };
指针从理解上来说就是地址,指向的内容就是通过地址找到的内容
从地址开始找几个字节就是看指针类型
所以指针数组,里面放的是指针,换句话说,里面放的是地址.
int(*arr)[3];//这么写对不对
想想?按上面一样分析
因为(*arr) arr先与*结合 说明是一个指针
又有[],说明是个数组
指向的数组的类型是什么?
也只剩下int了,所以被指向的数组的元素类型是整型
(啥?你说int是arr的类型?那你不扯呢,前面刚说了arr是一个指针)合起来:arr是一个指针,指向的是一个数组,数组有三个元素,每个元素是整型
有点懵的话可以先跳过去,后面会具体讲
小结:指针数组 本质上还是数组,不过是里面放的东西不同
---------------
总结
指针和数组的关系密不可分,二级指针存的就是一级指针的地址,指针数组本质上还是数组,学会类比的推理很有用!
------------------
如果有启发的话,留个赞再走吧,这对我帮助很大!
不点?