指针函数与函数指针的区别

转载自https://www.cnblogs.com/xiaowuqing/p/7623375.html


1、指针函数本质是一个函数函数返回类型是某一类型的指针

    格式:  类型标识符    *函数名(参数表)

                   int *f(x,y);

float *fun();
 
float *p;
 
p = fun(a);

 

int* find(void);
 
int * find(){
 
     int *pp ;
      pp= 0;
    return pp;
     
}
 
int main(int argc, const char * argv[]) {
 
    int *pp ;
    pp = find();
 
    return 0;
}

本质是函数。只是这个函数返回的是 一个执行某一类型数据的指针。

 

 

2、函数指针是指向函数的指针变量,即本质是一个指针变量

     格式:类型说明符 (*函数名)(参数)

                int (*f) (int x); 

    指向函数的指针 包含了函数的地址,可以通过它来调用函数

   其实这里不能称为函数名,应该叫做指针的变量名这个特殊的指针 指向一个返回整型值的函数实现地址。指针的声明必须和它指向函数的声明保持一致。

int  xMax(int a,int b){
    return a>b?a:b;
     
}
int main(int argc, const char * argv[]) {
 
     
    int (*xMaxValue)(int a,int b) = &xMax;// &可以省略
     
    int d = xMaxValue(xMaxValue(2,4),3);
    printf("最大的数字是: %d\n", d);
}

  指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。

   辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

 

3、回调函数

函数指针作为某个函数的参数

函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数

简单讲:回调函数是 由别人的函数执行时 调用你实现的函数

 

例如下面的代码中:
1.populate_array函数中的 函数指针getNextValue,就像是一个待填充的空。

2.调用populate_array函数时,将符合getNextValue格式的函数getNextRandomValue 填充进去(往空里面,填符合要求的函数),然后populate_array就可以使用getNextRandomValue的功能了。

// 回调函数
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}
  
// 获取随机值
int getNextRandomValue(void)
{
    return rand();
}
  
int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    for(int i = 0; i < 10; i++) {
        printf("%d ", myarray[i]);
    }
    printf("\n");
    return 0;
}


 

回答: 指针函数函数指针是两个不同的概念。指针函数是一个函数,其返回值是一个指针。它的定义和普通的函数定义相同,只是返回值是一个地址。当调用指针函数时,需要将返回值赋给一个相同类型的指针变量。例如:int *fun(x); int* p; p=fun(a);。而函数指针是指向函数指针,它包含了函数的入口地址。函数指针的声明格式为:类型说明符 (*函数名)(参数)。需要注意的是,这里的函数名实际上是指针的变量名,它指向一个返回整型值的函数函数指针的声明和它指向函数的声明保持一致。因此,指针函数函数指针在用法和定义上有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [函数指针指针函数用法和区别](https://blog.csdn.net/luoyayun361/article/details/80428882)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [函数指针指针函数区别](https://blog.csdn.net/yinmosujin/article/details/121897897)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [指针函数函数指针区别](https://blog.csdn.net/m0_57882370/article/details/121858443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值