C语言函数指针*p和p的含义

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.