高级指针
高级指针:包括双指针(二级指针)、void指针、函数指针。
1. 双指针
双指针(二级指针),是指针的指针。
2. void指针
void指针:万能指针,代表任意类型的指针。
malloc分配堆内存时,由于无法确定内存存储类型,所以可以使用void*代表任意指针类型。
3. 函数指针
- 函数指针是指向函数的指针变量,每个函数都有一个入口地址,指针变量中保存函数的入口地址
- 每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样。
- 函数指针有两个用途:调用函数和做函数的参数。
函数指针的声明方法为:
返回值类型 (*指针变量名) ([形参列表]);
函数指针(指向函数的指针)的定义格式:
函数也会占用一块存储空间,因为函数也会占用一块存储空间所以函数也有自己的地址
函数的地址保存在函数名中,函数名就是函数的地址 == 数组名就是数组的地址
数组名就是指向数组第一个元素的常量指针,函数名也是指向函数第一条指令的常量指针。
函数指针的语法格式:
函数指针的优缺点:
- 优点:是对于通用函数中要涉用到另一个函数,但函数名称未定,是让用户编的,此时需要使用函数指针。
如,通用定积分计算,被计算函数是待定的,是由调用者确定的函数
如,通用排序函数也是,比较函数与交换函数也是让用户自己编的
- 缺点:是由于函数指针指向的函数未定,容易导致程序崩溃。
判断类型
怎么判断类型:从右往左边看,没有括号就看最右边是什么类型就是什么类型;有括号,括号里是什么类型就是什么类型。
- int *a[10] 指针数组
- []的优先级比*高,a代表一个数组,其数组元素存储的类型是int *;
- a的值代表数组首元素a[0]的地址值,是一个指针,即*a=a[0],只是需要注意的是这个指针类型为const,即不能改变的。
- int (*a)[10] 数组指针
- a代表一个数组指针,它指向一个int [5]型的数组;因为a的类型,所以a++后,它会偏移sizeof(int)*5 个字节。
-
(int)有参数就是函数
-
int (*a)(int) 函数指针
-
int *a (int) 指针函数
-
函数和方法的区别:函数是大家的,没有类。方法是类的,不是所有人都能用。