最近更文有点疲倦了,虽然我的更文没啥文笔可言,我还是硬着头皮来了,那今天就说说函数指针吧~~
代码如下:
int compareInt(const void* a, const void* b) {
printf_s("调用compareInt函数啦!好骚啊!\n");
int* a1 = (int*)a;
int* b1 = (int*)b;
printf_s("a的地址: 0x%p b的地址: 0x%p\n", a, b);
return *a1 - *b1;
}
int x = 10;
int y = 100;
//函数地址
printf_s("compareInt的地址是:0x%p\n", &compareInt);//0x5465FABC
compareInt(&x, &y);
函数也有自己的空间和地址,我们对函数compareInt进行地址打印,得到了函数地址0x5465FABC。调用这俩个函数,传进普通变量 x 和 y 的地址。在compareInt函数里,我们使用空指针 a 和 b 来接传入的俩个地址,同时把空指针类型强制类型转换为int类型,写为: int* a1 = (int*)a;int* b1 = (int*)b;,我们在这里是为了调换俩个数值,这是空指针在函数中的应用。
int (*fp)(const void* a, const void* b);
fp = &compareInt;
(*fp)(&x, &y);//第一种
fp(&x, &y);//第二种 直接调用
定义一个函数指针,函数指针的定义,把函数声明移过来,把函数名改成(*函数指针名)。就像上面的compareInt函数,把函数声明
int compareInt(const void* a, const void* b) 移过来,然后去掉函数名,取名为fp,在前面加上 * ,这样就定义了一个函数指针
int (*fp)(const void* a, const void* b);,再把函数指针指向函数compareInt的地址,即&compareInt。
调用函数指针,可以有俩种方式。第一种:(*fp)(&x, &y);,这按普通指针解引的方式进行调用,(*fp)等同于函数compareInt。第二种: fp(&x, &y);,对函数指针直接调用。
这什么会有俩种调用函数指针的方式呢?
1.贝尔实验室的C和UNIX的开发者采用第一种形式,而伯里克的UNIX推广者
2.采用第二种 ANSI(国标) C兼容了俩种方式。(其实我也不太懂这俩种说的是啥,应该是C语言的俩个不同实验室推出的,哈哈哈~)
今天就到这里啦~~