摘要:文章目录前言一丶野指针指针的运算指针整数指针指针指针的关系运算二字符指针三指针数组与数组指针指针数组数组指针四数组名与数组名五数组参数指针参数一维数组传参二维数组传参一级指针传参二级指针传参六丶函数指针函数指针即指
我自己前段时间一直在学习指针方面相关内容,个人觉得对于像我这样的初学者来说,学到指针这里就感觉到相对比较困难了,所以呢,在学完指针之后,特此做一个指针方面的知识汇总,以及一些易错点,如果有不完善的地方,还望大家多多指正。
我们先来说一个指针中容易犯的错误,什么叫野指针呢?
野指针就是说指针指向的位置不可知,常见的造成野指针的原因有以下三点
1.int* p; 未对指针初始化,如果我们不知道地址,那我们写成int*p=NULL;即可
2.指针越界访问
3.指针指向的空间释放
指针±整数,就是访问地址是时跳过几个元素,大家可以看看这个代码感受一下。
指针-指针:指的是同一块空间里指针与指针之间元素的个数
指针的关系运算,简单的就可以理解为指针所指向那个空间所对应指的大小运算
字符指针这里比较简单,就比如char* 就是一个字符指针,在这里我就给大家分享一道例题
在这里,第一个if语句,执行的是else,if里的str1 与str2分别指的是数组首元素地址,虽然数值相同,但地址是不同,大家可以注意一下;第二个if,*str1,*str2,解引用操作就指的是数组第一个元素,都是h,所以这时候就是相等的。希望这题能对大家有帮助。
指针数组的本质上是一个存放指针的数组
数组指针的本质上指向数组的指针。
int* p=NULL;//p是整形指针——指向整形的指针——存放整形的地址char* pc=NULL;//pc是字符指针——指向字符的指针——存放字符的地址//那么数组指针就是——指向数组的指针——存放数组的地址
那么问题来了,这样一个数组指针该怎么表示呢?
int arr【10】 ={0};int* p【10】 =&arr;//是这样吗?应该不是,【】的优先级高于*,所以这样就是一个存放指针的数组了,即指针数组int(*p)【10】=&arr;//这样就合理了,首先可以知道他是一个指针,然后指向的是一个数组,所以是存放数组的地址,即数组指针
那我们再看一个例子,char* arr【5】;
这个数组指针又该怎么表示呢?________=&arr;
想
到
答
案
了
吗
?
正确答案是: char*((*pa)【5】)=&arr;
那为什么呢?下面用一副图给大家解释一下
最后我们再来整理一下数组指针和指针数组
多带带的数组名,就是首元素的地址
arr 与 &arr【0】表示的意义是一样的,都是首元素地址
有两种例外,数组名不多带带表示数组首元素地址
1.我们计算字符串长度的时候
int sz=sizeof(arr)/sizeof(arr【0】);//这里 arr就表示的是整个数组
2.&arr,&arr表示的是取整个数组的地址,而不单单是一个元素的地址
3.&arr+1 跳过的是整个数组;arr+1 跳过的一个元素
像上面的传参形式都是正确的,一维数组传参,可以直接用数组来接收,也可用指针来接收,因为传参传的就是首元素地址;像test2 指针数组传参,原理是一样的 可以直接用指针数组接收,要注意的是用指针进行接收时要用二级指针,因为指针数组里的元素本来就是地址,现在传首元素的地址,可以理解为传地址的地址,所以应该用二级指针接收。
在函数里: &函数名 与 函数名 都指的是函数的地址
比如一个加法 函数
int Add (int x,int y)int (*p)(int ,int)=Add;//它写为指针的形式就是这样,交代清楚返回类型,(*p)保证它为指针
但是在调运函数指针时,* 或者不解引用都可以,比如说:
print(“%d”,p(2,3);//p里存的就是Add的地址 相当于Add(2,3)print(“%d”,(*p)(2,3)//这俩个结果都是相同的
通过上面的介绍,我们就知道,这个函数指针数组呢,它是一个存放函数指针的数组,数组里存放的是每一个函数的地址,根据这个概念呢,我突发奇想,做了个加减乘除的计算器,数组里放了每个函数,有些不足也希望大家可以指正,代码如下:
当时看到这个的时候已经崩溃了,指针就是无限套娃又套娃吗???!!!
我们可以根据这个代码理解一下指向函数指针数组的指针,就是套娃再套娃!
自己目前学习关于指针的内容总结出来就是这些啦,有不足和纰漏的地方欢迎大家多多指正,都看到这里了,点个赞再走吧,谢谢大家.
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123077.html
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), 毕竟算法不是做了一遍就能完全记住的. 所以本文适合已经知道解题思路和方法, 想进一步加强理解和记忆的朋友, 并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解, 然后再看本文内容). 关...
摘要:与比较中与比较关键字用来在函数或其他局部作用域中使用全局变量。亲自动手试后,发现使用了只会读闭包内的变量,可以隔着多层上一哥们类比看作为步骤 这篇文章是抄抄写写得来的,纯粹是这个编辑器比笔记的好太多,才在这儿写。 函数参数传递 Python的函数参数传递 对于变量(与对象相对的概念),其实,python函数参数传递可以理解为就是变量传值操作,用C++的方式理解,就是对void*赋值。如...
摘要:此专栏文章是对力扣上算法题目各种方法的总结和归纳整理出最重要的思路和知识重点并以思维导图形式呈现当然也会加上我对导图的详解目的是为了更方便快捷的记忆和回忆算法重点不用每次都重复看题解毕竟算法不是做了一遍就能完全记住的所 ...
摘要:最近手头上做了一个很大的后台管理项目,前端对复杂数据的处理要求颇高,也确实让自己发现了很多之前被忽视的细节。鸣人佐助卡卡西佐助佐助佐助但是很遗憾及更早版本也不支持。 最近手头上做了一个很大的后台管理项目,前端对复杂数据的处理要求颇高,也确实让自己发现了很多之前被忽视的细节。在此特整理出来,希望不熟悉的朋友们们以后可以绕开我踩的这些坑。本文初衷在于帮助大家梳理一些数组操作上的重点和易...
摘要:针对于面向对象编程的。因为面向对象就是针对对象例子中的守候来进行执行某些动作。这就是闭包的用途之一延续变量周期。把变量放在闭包里面和放在全局变量里面,影响是一致的。 1.前言 这段时间,金三银四,很多人面试,很多人分享面试题。在前段时间,我也临时担任面试官,为了大概了解面试者的水平,我也写了一份题目,面试了几个前端开发者。在这段时间里面,我在学,在写设计模式的一些知识,想不到的设计模式...
阅读 1078·2023-04-26 03:02
阅读 1121·2023-04-25 19:18
阅读 2564·2021-11-23 09:51
阅读 2539·2021-11-11 16:55
阅读 2563·2021-10-21 09:39
阅读 1651·2021-10-09 09:59
阅读 1969·2021-09-26 09:55
阅读 3491·2021-09-26 09:55