全面剖析《指针》,实现《指针》入门

2021-12-28 23:26
前言
❤️ :热爱编程学习,期待一起交流。

在《C语言深度剖析》这本书上,我看到了这句话:普通人用 C 语言在 3 年之下,一般来说,还没掌握 C 语言;5 年之下,一般来说还没熟悉 C 语言;10 年之下,谈不上精通
所以我只能说带大家入门指针,仅仅是了解指针而已。怎么用的话,我再学几年也不一定能用明白。


因为涉及到用法后就会显得更加枯燥和冗余后续再入门指针的用法和怎么用,本篇讲讲我对指针的理解。这两天和女朋友闹矛盾了,心情甚是难受,因此去看了一些关于指针的视频,一不小心就《入门》了指针。虽然在学校时老师已经讲过了指针,老师一节课2小时把C语言指针讲完了,虽然我没听懂,但我大受震撼。但我觉得那并不是入门,那只是让我知道了C语言有指针这个概念罢了。只是占了冰山一角的一丢丢丢…(冰山一角占整个冰山的1/10,两个小时怎么能入门呢?)。因此在12.25日至12.26日下午看了两天的指针视频以及书籍,收获颇大,我想以笔记的形式并简介的记录下来,仅供大家参考,同时以便我以后的温故而知新。如有纰漏,欢迎指出。

❤️指针
理解指针的两个要点
指针就是地址。
平时老师口头说的指针就是指针变量,指针变量是用来存放地址的。
  int a = 10;//创建变量a,a里存储10。
  int* p = &a;//创建变量p,p里存储a的地址。

p是指针,存放的是a的地址。我们通常称int* p = a为p指向了a。

为什么用指针这个名词来称呼?
p是变量,p里面存储了a的地址,我们可以通过*p找到p所存储地址上的值。所以称p指向了a。 所以我们把变量p叫做指针。
假设张三欠李四了十块钱。

  int 张三 = 10;//现在张三的口袋里揣了10块钱
  int* 李四 = &张三;//李四手里拿着张三的地址

现在李四要发射一个定位导弹炸张三。在发射之前我们需要精准锁定张三位置。然后我们就可以通过锁定的位置找到张三进行发射导弹。


指针也和定位导弹一样。指针就是李四。李四里面存储着张三的地址。知道了张三的位置后李四就可以找到张三并拿走10块钱。

  *李四 = 0;//这样就轻松的把张三的十块钱拿走了。

❤️一级指针
整型指针
  int a = 10
  int* p = &a;

p是整型指针-指针类型为int*-我们也把p叫做指向整型a的指针- 整型指针存放的是整型的地址

浮点型指针
  float* p;

p是float型指针-指针类型为float*-我们把p也叫做指向浮点型的指针-浮点型指针存放的浮点型的地址

字符指针
以此类推
  char* p

p的指针类型是char*-p是指向字符的指针-字符指针存放的是字符的地址

总结
指针的标志符号是“*”号
指针类型是int*, float*, double*, char* ,一类的,反正都要加*号。
指针指向的是一个值。

❤️指针数组
其实我想直接叙述数组指针的概念的,不想提这个指针数组的,因为这两个词刚好颠倒过来,容易搞迷糊,但是不提的话,又叙述不明白。所以我又加了这个关于数组的东西。
要点:指针数组就是数组
数组的类型是什么?
先看看以下变量的类型是什么。
  int a = 10; 整型变量a的类型是 int
  float a = 10;浮点型a的类型是 float
  int* p = &a;指针变量p的类型是 int*


那么一个数组arr的类型是什么呢?
 int arr[5]={1,2,3,4,5};

arr是数组的名字,也就是数组名。很多人会以为数组的类型是int,但他的类型是int[5]
是的,他的类型的确是int[5],而arr数组里的每个元素的类型才是int。
int arr[5]的含义是:在arr数组中有五个元素,每个元素的类型是int。而arr数组的类型是int[5]。
这些在vs的监视窗口中都是可视的。

指针数组到底是指针还是数组?
判断他是数组还是指针关键在于后两个字。后两个字是数组他就是数组。
首先他是个数组,我们可以先创建一个整型数组arr[5].
  int arr[5];

然后他是指针数组,只需要在arr[5]前面加上“*”号就可以了。因为星号是指针的标志
  int* arr[5]

那么指针数组的类型是什么?
打开vs的监视窗口

可以看到,指针数组的类型是int*[5],其中的五个元素的类型是int*,而int*的类型就是指针类型。说明指针数组里面的五个元素是指针,也就是地址。

总结
指针数组是一个数组
数组的每个元素的类型是指针类型。即每个元素都是指针
整型数组的类型是int[],整型指针数组的类型是int*[]
❤️数组指针
要点:数组指针本质还是指针,只需要看最后俩字就可以了。而指针说白了还是地址。

什么是数组指针?
首先,数组指针,数组指针,说到底还是个指针。
所以我们可以写为*p,来表明p是个指针
  int* p;

第二,他是数组指针 ,如果你写为int* p[5]
那就大错特错了,我们刚刚已经说过这是指针数组了。
因为[]的优先级大于*,所以p先和[]结合成数组,再和*结合为指针,也就形成了指针数组。
现在我们要的是数组指针。所以应写为
  int (*p)[5];

因为()的优先级大于[],所以*先和p结合为指针。然后指针再和[5]结合为数组。成为数组指针。
int (*p)[5]的含义:定义了一个数组指针p,指针p里面存储的是数组的地址,也就是p指向了一个数组。

数组指针的类型是什么?
  int (*p)[5]的类型是int[5]*

因为数组指针的本质还是指针,所以它需要一个*来表明它是指针。在前面加上数组的类型int[5]就是数组指针了。
但我们平常书写数组指针的类型不这么写。而是写为int (*)[5].。这是平时的大众写法。

总结
数组指针是指针,储存的是数组的地址,指向一个数组,而数组的每个元素是int型。
数组指针的类型是int (*)[].
指针数组的类型是int* [].
二者的类型区别就在于()的优先级

❤️二级指针
什么是二级指针?
要点:指针的指针就是二级指针。也就是指针的地址
int a = 10;
int* p = &a;//p是一级指针
int** p1 = &p//p1是二级指针

a的地址存储在p中,p的地址存储在p1中。
所以p是一级指针,p1是二级指针。
❤️函数指针
什么是函数指针?
由上面的整型指针,字符指针,数组指针的铺垫,我们可以推断出来函数指针是什么。
只用看后两个字,后两个字是指针,他就是指针,指针就是地址。
要点:函数指针是一个指向函数的指针-指针里面存储的是函数的地址

函数指针怎么表示
首先,他是指针,我们就先创建一个整型指针。
int *p;

其次,他是函数指针,我们还需要一个()来表示它是函数,因为函数的标志是(),比如我们的main()函数。
所以要写为int *p(), 但这样写是错的,因为()的优先级大于*
所以正确写法为int (*p)().这就是函数指针。

函数指针的类型是什么?
我们模仿数组指针。
函数指针的类型也就是int (*)()。
总结
最后我想再次强调一下,指针就是地址。
 
分享到:
文章评论 · 所有评论
评论请遵守当地法律法规
点击加载更多
本月点击排行
精彩图片
京ICP备14056871号
Copyright ©2022 USN, All Rights Reserved