指针方面相关内容,及其易错点
文章目录
前言
我自己前段时间一直在学习指针方面相关内容,个人觉得对于像我这样的初学者来说,学到指针这里就感觉到相对比较困难了,所以呢,在学完指针之后,特此做一个指针方面的知识汇总,以及一些易错点,如果有不完善的地方,还望大家多多指正。
一丶野指针
我们先来说一个指针中容易犯的错误,什么叫野指针呢?
野指针就是说指针指向的位置不可知,常见的造成野指针的原因有以下三点
1.int* p; 未对指针初始化,如果我们不知道地址,那我们写成int*p=NULL;即可
2.指针越界访问
3.指针指向的空间释放
指针的运算
1.指针±整数
指针±整数,就是访问地址是时跳过几个元素,大家可以看看这个代码感受一下。
2.指针-指针
指针-指针:指的是同一块空间里指针与指针之间元素的个数
3.指针的关系运算
指针的关系运算,简单的就可以理解为指针所指向那个空间所对应指的大小运算
二、字符指针
字符指针这里比较简单,就比如char* 就是一个字符指针,在这里我就给大家分享一道例题
在这里,第一个if语句,执行的是else,if里的str1 与str2分别指的是数组首元素地址,虽然数值相同,但地址是不同,大家可以注意一下;第二个if,*str1,*str2,解引用操作就指的是数组第一个元素,都是h,所以这时候就是相等的。希望这题能对大家有帮助。
三、指针数组与数组指针
1.指针数组
指针数组的本质上是一个存放指针的数组
2.数组指针
数组指针的本质上指向数组的指针。
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 跳过的一个元素
五、数组参数、指针参数
1.一维数组传参
像上面的传参形式都是正确的,一维数组传参,可以直接用数组来接收,也可用指针来接收,因为传参传的就是首元素地址;像test2 指针数组传参,原理是一样的 可以直接用指针数组接收,要注意的是用指针进行接收时要用二级指针,因为指针数组里的元素本来就是地址,现在传首元素的地址,可以理解为传地址的地址,所以应该用二级指针接收。
2.二维数组传参
3.一级指针传参
4.二级指针传参
六丶函数指针
1.函数指针:即指向函数的指针——存放函数地址的指针
在函数里: &函数名 与 函数名 都指的是函数的地址
比如一个加法 函数
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)//这俩个结果都是相同的
2.函数指针数组
通过上面的介绍,我们就知道,这个函数指针数组呢,它是一个存放函数指针的数组,数组里存放的是每一个函数的地址,根据这个概念呢,我突发奇想,做了个加减乘除的计算器,数组里放了每个函数,有些不足也希望大家可以指正,代码如下:
3.指向函数指针数组的指针
当时看到这个的时候已经崩溃了,指针就是无限套娃又套娃吗???!!!
我们可以根据这个代码理解一下指向函数指针数组的指针,就是套娃再套娃!
七丶总结
自己目前学习关于指针的内容总结出来就是这些啦,有不足和纰漏的地方欢迎大家多多指正,都看到这里了,点个赞再走吧,谢谢大家.