若是阁下满意的话,可否一键三连呢!
第一篇进阶指针就是先了解各种新的概念(用法我们后面几篇再详细说!先只介绍概念),有疑惑很正常,只是暂时的,我们一起来看看吧!
字符指针
顾名思义,就是存储字符的指针,指向字符的地址,但是多用来存储字符串,指针指向的也是字符串第一个字符的地址
我们看写法:
可以看到,第二句有问题,原因是部分编译器不支持这种写法,当然第一种写法是最正确的,记得加上const
我们再知道,加上const修饰后,是不是就相当于把它的内容锁定了(不能被修改),字符指针中的字符串内容(常量)不能被修改
因此我们再来看一个例子 :
我们先来看第一对,这是2个字符指针,我们知道常量字符串内容不能被修改,那么在占用内存的时候是不是只要占用一处是不是就行了,那么它的地址是不是也就一样了,如果两个字符指针的字符串内容相同,那么它们指针指向的地址是相同的(等价)
我们再来看第二对,这是2个数组,它们内容一样,但是常量字符串初始化数组后,是把字符串内容拷贝到数组里面的,然后数组是在栈区开辟的,两个数组,在栈区上的空间是不一样的
指针数组
同样我们猜到,指针数组就是存储指针的数组,数组里面放的是指针(地址)
那么我们刚才了解到字符指针是放的首字符的地址,我们来看字符指针数组:
同样它被const修饰后,也不能改变它的数组内容(个人辨别标志就是 const跟后面存储的常量字符串),关于用法我们后面几篇再详细说,这里只解释这个概念
下面还有存储整型数组地址的数组,整型指针数组:
它存储的是整型的数组名(地址) ,我们通过arr【0】,arr【1】就访问了这两个数组,但是注意整型没有“\0”,因此如果要打印每个数组元素,需要使用循环,比如:
(下面2种打印方法等价)
数组指针
(困难的来了!)数组指针就是存储数组的指针,但是不是指向数组首元素!(重点注意),它指向的是整个数组!整个数组!整个数组!
我们先初始化一个整型数组arr,存放的是10个int类型的元素
第二句就是数组指针: *表示它是指针,p是指向含有10个int类型数组的指针(即指向整个数组)
重点重点重点!我们再来看“&数组名”与“数组名”的区别
&数组名表示数组的地址(整个数组的地址)
数组名表示数组首元素的地址
数组指针指向的是整个数组的地址,如果不加&,编译器也不会通过或者发出警告
为什么要加()跟【】呢?
我们看优先级
() 跟【】优先级相同,从左往右算,()里面的*p是先告诉我们这个是指针和它的指向,后面【】才是数组,即指针数组
下面我们看下它的一个应用:
我们来解释一下:
* 代表它是指针,p指向的是4个int类型数组的指针,如果还不清楚,我们接着看
下面的打印:先对p+i解引用,表示第几行(i表示第几行,那么一行是不是4个元素),后面的 j 控制列
为了方便理解,我们再看几个例子:
我们先看第一个:这是一个数组,存储的是5个int类型的元素
第二个:这是指针数组(存放指针的数组),里面是5个int*类型的元素
第三个:这是数组指针(存放数组的指针),arr是指针指向数组,数组里面有10个元素,每个元素是int类型
第四个:这是一个数组指针数组,我们发现括号()里面的和第三个一样。括号里面表示arr是指针指向数组,这个数组有10个int类型的元素,外面那个5就表示像这样的数组有5个,每个数组都是int*【10】类型
数组参数,指针参数
注意:数组参数接收的要么是指针,要么是数组
我们先看一维数组传参的几种方式:
第一种第二种我们都很好理解,传过去的是数组名,我们就用数组接受
第三种,传过去的是数组首元素地址,我们就用指针接收地址
(简单快捷的就是把那个数组等号左边的直接抄一遍,虽然很无脑哈哈哈!但是很实用)
二级数组传参(行可以省,列不能省,切记)
第一种第二种都是上面说的很实用方法,哈哈哈!
第三种就是用数组指针接收,这里的二维数组可以看成3个一维数组,这样就方便理解了,每个一维数组有4个元素
一级指针传参
首先p是一个一级指针,指向数组首元素,我们接收也用指针接收,因为整型没有\0,所以我们如果想打印每个元素,需要用到循环,那么就需要传数组元素个数过去,来控制循环
二级指针传参
传过去pc是二级指针,我们用二级指针接收,我们继续!
函数指针
指向函数的指针
解析:
1:先创建一个函数指针,注意*p要加括号,因为优先级问题
p是指向函数地址的指针变量
2:&可以不加,因为&函数名跟函数名都是函数的地址,但为了方便理解,新手建议不要省略
第一篇进阶我们先认识几个概念,有很多不懂很正常,我们把指针进阶看完就解决了!记得练习哦