两类较难理解的指针
我们通过对取地址操作符(&)拿到的地址是一个数值,我们将这个数值存放在指针变量中,
例如:
指针变量也是一种变量,这种变量是用来存放地址的
此时我们看到指针变量的类型为int* 其中*代表该变量为指针变量,前面的int则代表变量pa指向的是int类型的变量。
那么如果指针变量存放的不是int类型的变量而是其它类型的该怎么去定义呢?
但是有一种特殊类型的指针是void*类型,我们可以理解为无具体类型的指针,它可以接受任意类型的地址,但是它也有一定的局限性,就是不能进行+-整数和解引用(*)操作的运算
我们可以看到,将一个int整型变量的地址赋值给char*类型的指针变量,编译器给出了警告,原因是类型不兼容,而使用void*就没有警告。
此时,我们对void*变量进行解引用操作
因此编译器无法用void*类型的指针直接进行计算。
数组指针:
顾名思义,其代表的意思为指向数组的指针
定义的方式为:int (*p)[10];
解释:*先和p进行结合,用来说明p是一个指针变量,指向的是一个有十个元素的整型数组。因此p是一个数组指针。
在这里,&与*都是向右结合的,但是[]的优先级要高于*,所以必须用()来保证*与p进行结合
否则定义出来的结果为int *p[10],它被称作指针数组,数组中有是个元素,元素的类型为指针,指向的是int类型。
数组指针变量如何进行初始化
如果要存放整个数组的地址,那么就要放在数组指针变量当中
如下:
函数指针
根据整形指针,字符指针,数组指针的定义进行类比,可以得出,函数指针就代表指向函数的指针,存储的是函数的地址,之后可以通过函数的地址来调用函数。
其中我们把函数地址打印出来也可以看出,函数名代表的函数的地址
利用函数指针来进行调用: