目录
一.概念
函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址;
数组指针是指向数组的指针
函数指针是指向函数的指针–存放函数地址的一个指针
看代码
#include<stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n",test);
printf("%p\n",&test);
}
运行结果是
从这里我们就可以看出:&函数名和函数名都是函数的地址
二.函数指针写法
代码
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int a=10;
int b=20;
printf("%d\n",Add(a,b));
}
上面是最常用的函数调用方法,下面我们就用函数指针试试
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int a=10;
int b=20;
printf("%d\n",Add(a,b));
int (*p)(int,int)=Add;//函数指针的写法跟数组指针的类似
printf("%d\n",(*p)(a,b));
printf("%d\n",(*p)(2,3));
}
运行结果
我们刚刚知道:&函数名和函数名都是函数的地址,那么我们还可以写成
代码
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int a=10;
int b=20;
printf("%d\n",Add(a,b));
int (*p)(int,int)=&Add;//函数指针的写法跟数组指针的类似,这里加上了&
printf("%d\n",(*p)(a,b));
printf("%d\n",(*p)(2,3));
}
运行结果是
加不加&-取地址符最后的结果都是一样的
注意
上述代码中的*没有太大价值,就算写p,*p,**p,***p,……最后的结果都是没有影响的
代码
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int a=10;
int b=20;
printf("%d\n",Add(a,b));
int (*p)(int,int)=Add;//函数指针的写法跟数组指针的类似,这里加上了&
printf("%d\n",(p)(2,3));
printf("%d\n",(*p)(2,3));
printf("%d\n",(**p)(2,3));
printf("%d\n",(***p)(2,3));
}
运行结果
再举个例子
#include<stdio.h>
void print(char* str)
{
printf("%s\n",str);
}
int main()
{
void (*p)(char*)=print;//把函数print的地址传给p
(*p)("hello world!");//(*p)就是利用指针的方法调用函数,它的效果跟直接调用函数是一样的
print("hello world!");//直接调用函数
}
运行结果是
问题
问题1
对于这两行代码,请问pfun1或者pfun2哪个是指针?
答案
pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。
问题2
请解释这段代码
(*(void(*)()0))
答案