指针的水很深,叔带你把握---C语言指针合集(3)

目录

一、指针和数组

二、一级指针与二级指针

三、指针数组

总结


 

一、指针和数组

指针与数组,听起来是两个不同的东西,实际上联系紧密。

 

 

指针的水很深,叔带你把握---C语言指针合集(3)_第1张图片

看下面一段代码:

指针的水很深,叔带你把握---C语言指针合集(3)_第2张图片

 

看看具体含义:

pa: 数组首元素的地址

a: 数组名

&a: 数组的地址

显然,数组名就是首元素地址,数组名就是首元素地址,数组名就是首元素地址

这一点十分重要,在函数传参时经常使用!

关于&a,值虽然都是一样的,但是意义完全不同,后面的指针合集会讲,暂时只需要知道前面两个

关于数组名是首元素地址的印证

解引用首元素即可

指针的水很深,叔带你把握---C语言指针合集(3)_第3张图片

看看内存分布

指针的水很深,叔带你把握---C语言指针合集(3)_第4张图片

用指针接收数组名的用法:

指针的水很深,叔带你把握---C语言指针合集(3)_第5张图片

-----在这里我们知道数组名是首元素的地址----

那么是地址肯定可以寻址访问,也就是解引用. 

 ( 0x00000000一般不能访问,也就是空指针)

a[0] 访问第一个元素

a[1] 访问第二个元素

······

a[4] 访问第五个元素

很普通的用法

怎样通过指针的方式访问数组的元素?

#include

int main()
{
	int a[5] = { 0,1,2,3,4 };
	printf("%d\n", a[1]);//等于什么?
	printf("%d\n", *(a+1));//等于什么?
	return 0;
}

指针的水很深,叔带你把握---C语言指针合集(3)_第6张图片

a[1]==*(a+1)

推广:

a[n]==*(a+n)

这就是通过指针访问数组的方式

指针的水很深,叔带你把握---C语言指针合集(3)_第7张图片

中规中矩,指针的水很深,叔带你把握---C语言指针合集(3)_第8张图片

等同于

指针的水很深,叔带你把握---C语言指针合集(3)_第9张图片

---------知道了通过指针访问数组---

其实讲到这就差不多了,但还可以再深入一点,毕竟指针水深啊

*(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为例

指针的水很深,叔带你把握---C语言指针合集(3)_第10张图片

附上每个元素的地址:.

(整型四个字节,跳过一个整型元素==地址+4)

指针的水很深,叔带你把握---C语言指针合集(3)_第11张图片

二、一级指针与二级指针

怎么存放pa的地址?

指针的水很深,叔带你把握---C语言指针合集(3)_第12张图片

指针的水很深,叔带你把握---C语言指针合集(3)_第13张图片

提取概要:怎么存一级指针的地址?

此时就要引入二级指针了

 

int main()
{
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;//二级指针
	printf("%p\n", ppa);
	return 0;
}

指针的水很深,叔带你把握---C语言指针合集(3)_第14张图片

ppa就是指针变量名pa的地址

与一级指针的差别就是多了一个*,但是存的都是地址,自然也可以访问

question 1:

如何通过二级指针访问一级指针的内容(通过ppa访问pa的内容)

由于ppa指向pa,要访问pa只要解引用就可

指针的水很深,叔带你把握---C语言指针合集(3)_第15张图片

question 2:

如何通过二级指针访问一级指针指向的内容(通过ppa访问a的内容)

由于ppa指向pa,pa指向a  

*ppa==pa   *pa==a   故  * (*ppa)==a==**ppa

所以先通过ppa访问pa,再通过pa访问a

指针的水很深,叔带你把握---C语言指针合集(3)_第16张图片

第三第四种写法相同,第四种更为常见

 

-------知道了二级指针是什么

-------能通过二级指针访问一级指针

-------能通过二级指针访问一级指针指向的东西

 

 

三、指针数组

指针和数组连一起了

那指针数组是指针还是数组?

指针数组是数组,不是指针

整型数组  是一个数组,数组里放的是整型

字符数组  是一个数组,数组里放的是数组

结构体数组  是一个数组,数组里放的是结构体

···

指针数组  是一个数组,数组里放的是指针

这点很重要,后面指针进阶还有个东西叫做 数组指针...

指针的水很深,叔带你把握---C语言指针合集(3)_第17张图片

先看如何定义

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是一个指针,指向的是一个数组,数组有三个元素,每个元素是整型

有点懵的话可以先跳过去,后面会具体讲

小结:指针数组  本质上还是数组,不过是里面放的东西不同

指针的水很深,叔带你把握---C语言指针合集(3)_第18张图片

---------------

总结

指针和数组的关系密不可分,二级指针存的就是一级指针的地址,指针数组本质上还是数组,学会类比的推理很有用!

 

 

 

------------------

如果有启发的话,留个赞再走吧,这对我帮助很大!

不点?

指针的水很深,叔带你把握---C语言指针合集(3)_第19张图片

 

 

 

你可能感兴趣的:(C语言指针,c语言,c++,指针,算法)