int add(int a,int b)
{
return a+b;
}
int main()
{
int (*p)(int);
p=add;
int k=(*p)(5,6);
k=p(5,6);
//这里p代表这个函数,那*p代表什么
return 0;
}
指针函数
这段代码里面
int (*p)(int);是一个函数指针,
但不管它是什么神仙指针,它就是个指针,把他当成指针看就行。
p不是代表这个函数,是指向这个函数,
因此 *p 就是这个指针的内容,既被指的函数的地址。
p指的是内存地址,*p指的是地址中存的东西。
函数指针的用法,
p是指针变量,*p是指针,(*p)(int)是函数指针;
add是add()函数入口地址,所以p=add,就表示函数指针指向add()这个函数;
int k=(*p)(5,6);k=p(5,6);这两句作用一样,都是函数指针调用方法
首先要知道的是程序在开辟内存的时候,内存的地址空间是有类型的,比如int a; a所在的地址&a就是一个int型的,类型表示的是寻址能力,比如char类型寻址能力就是往上+1,int一般就4。
那么函数的本质就是在内存中的一段可执行代码,函数名就是函数入口,存放的就是代码段的首地址,那么还有一个就是类型,在你这个示例中,类型就是int ()(int),因为在c语言中,对于一个地址的访问变量通常会被定义为指针,所以如果将int ()(int)等同于一个类型的话,函数指针可以被看作type * p,那么赋值也很简单,就是p=add。
接着就是访问,当我们访问一个char *类型的变量时,会是(char *)ch,但因为标准库的函数一般都会为我们识别或者默认好类型,通常省略(cha r*);也就是说,访问的内存的时候也是类型+首地址,类型大部分情况可以忽略,除非是强制转换;
那么对于函数的调用就是(type *)p(int, int) =>(int(*)(int,int))p(int,int)
在*p中表示的是p的地址,*p指向p。你可以理解为*p就是电脑里盒子的编号,而p就是盒子里的东西。
其中*p=&p.