指针和函数的纠缠——函数指针

最近更文有点疲倦了,虽然我的更文没啥文笔可言,我还是硬着头皮来了,那今天就说说函数指针吧~~

代码如下:

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语言的俩个不同实验室推出的,哈哈哈~)

今天就到这里啦~~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容