目录
免责申明(dog:
以下是我对指针的学习和片面的见解,有问题可以在评论区告诉我,我会改的(手动比心)。
一.字符指针变量
字符指针变量是一种指针变量
类型为:char*
使用方式:
和整形指针类似,它可以存放char类型的变量地址。
但它还有另外一种使用方式。
使用方式2:
问:那么这里有将整个字符串存入字符指针中吗?
答:其实指针中只存了字符串的首元素地址。
举个栗子:
可以看到我解引用p后只有字符串的首元素地址。
二.数组指针变量
2.1数组指针变量是什么
我们可以从类比知道,整形指针,字符指针,都是指针,那么数组指针也是指针(很容易和指针数组混淆)。
整形指针:存放的是整形类型变量的地址,能够指向整形数据的指针。
字符指针:存放的是字符类型变量的地址,能够指向字符数据的指针。
数组指针 : 存放的是数组类型变量的地址,能够指向数组的指针。
那么我们来分辨一些下面的程序是什么类型的。
(这里非常容易混淆)
我们可以看到,第一行是我们前面学习过的指针数组,第二行是我们今天要学的数组指针。
问:那么我们该如何去理解这个数组指针呢。
答: 首先(*arr)让我们知道arr是一个指针变量,然后指向是一个元素为10个的整形数组。所以p是一个指针,指向一个数组,叫指针数组。
2.2数组指针的初始化
问:那么我们如何进行初始化呢?
答:首先我们拿到我们需要存放的数组的地址(&arr是一整个数组的地址),然后如上图一般存放即可。
数组指针解析:
三.二维数组的传参本质
在我学习指针之前我的二维数组传参是这样的:
在我学习后我知道还可以这样写:
那么为什么这么写呢,我们来剖析理解一下。
首先我们可以将二维数组理解为由多个一维数组组成的数组,这个数组的每个元素都是一维数组,那么这个二维数组的首元素就是第一行一维数组。
所以我们以数组指针的方式来理解,里面的所有一维数组的类型是int [3],那么这个接收数组指针的类型就为int(*)[3],推到这里我们要明白二维数组传参本质上传的是第一行一维数组的地址,所以函数接收要用数组指针。
四.函数指针变量
4.1函数指针的创建
问:什么是函数指针呢?
答:顾名思义就是存放函数的指针。
问:那么函数有地址吗?
答:哪我们来实验一下。
可以看到是有的,不仅如此我们还可以看到,数组名就是函数地址,当然我们也可以用&地址的方式来取地址,
问:那么我们将如何将函数的地址存起来,如何创建函数指针呢?
答:函数指针其实类似数组指针,如下图:
我们可以看到其中void(*p)(int, int )=erwei就是函数指针,我们再通过变量名调用函数。
void(*p)(int,int)也可以写成void (*p)(int x,int y)(这样写会好理解一些)。
哪我们来分析一下这个函数指针:
4.2函数指针变量的使用
如图可以看到,函数指针的调用可以和调用函数一样。
4.3typedef关键字
typedef是用来将类型重命名的,可以将复杂的类型名简单话。
举个栗子:
不仅仅是普通的类型可以改变,指针类型也可以通过这个方法改变。
再举个栗子:
虽然大部分类型是可以向上图那种格式那样重命名,但是还是有个别例外的,比如数组指针 int( * )[5],
再再举个栗子:
数组指针重命名是将重命名的名字写在(*)中 。
函数指针和数组指针一样:
再再再举个栗子:
问:那么该如何运用呢:
再再再再举个栗子:
五.函数指针数组
上面我们已经学习了函数指针,而函数指针数组是用来存放函数指针的。
问:如何初始话呢?
答:
函数指针数组和函数指针很像,那么我们来分析一下。