指针类型有何用
指针也为内存地址,他在32系统中占用永远是 4个字节, 64位为8
所以用处就是在取值的时候系统知道怎么取,这就是类型规范的好处,因为是4个 固定,所以找下个只要知道偏移4就是下一个就可以
函数指针
函数本身就是指针,当我们定义了一个函数的时候他就有个内存地址,所以函数也可以当做参数传递,如下面例子
#include <stdio.h>
// 先定义下面二个方法
void add (int num1, int num2) {
printf("num1+num2 = %d\n", num1 + num2);
}
void mins (int num1, int num2) {
printf("num1-num2 = %d\n", num1 - num2);
}
// 再定义一个特殊的方法
void opreate(void (*method) (int,int), int num1, int num2){
// void (*method) 声明一个函数指针,可以传一个匹配的函数过来 void 返回值; (*method) 函数名; (int, int) 二个参数
method(num1, num2); // 执行传进来的方法, 并把num1,和num2当做参数给传进去。
}
int main () {
// 函数的指针在Java中类似接口回调
// 函数本身就是一个指针
opreate(add,10,20);
//上面一行代码,是把方法add传进来了,刚刚好add方法方法参数也是二个Int, 然后到opreate方法里执行了method也就是add函数,并100,200传入到add方法中,也就执行了add方法
// 输出结果: num1+num2 = 30
// 上面说了函数也指针,数组也是一样,那是不是他也有数组一样的特性也就是 add 和&add是不是一样的,答案是肯定的
printf("&add %p, add %p\n", &add , add); // &add 00F81168, add 00F81168 一样
}
函数当作参数的规范
#include <stdio.h>
void callBackMethod(char *fileName, int curdrent, int total) {
printf("%s图片压缩的进度是: %d/%d\n", fileName, curdrent, total);
}
/**
* 压缩方法
* 定义函数指针: 返回值(*名称)(int , double)
* @param fileName
*/
void compress(char *fileName, void(*callBackP)(char *, int, int)) {
callBackP(fileName, 5, 100); // 回调给外部,压缩的进度情况
}
int mian () {
// 规范是先定义一个函数指针出来如下 ,要不能在方法里 操作了原方法地址可能就会出问题
void (*call) (char *, int , int);
//然后将call 赋于地址
call = callBackMethod;
// 调用压缩方法
compress("derry.png", call);
}