深入理解C语言中的指向函数的指针和返回指针的函数

简介: #include#include/** 返回指针的函数和指向函数的指针*//** 定义一个函数,返回一个void指针,在C语言中,void指针可以* 指向任何类型*/void *func(){    /*     * 一种很容易犯的错误,将局部变量的地址返回     */    int m;    printf("define as void *func()\n");    return &m;}/** 声明一个指向函数的指针,指向返回类型为void指针的函数*/void *(*pfunc)();/*void (*pfun)();* 声明一个函数,指向一个返回void的函数。
#include
#include

/*
* 返回指针的函数和指向函数的指针
*/

/*
* 定义一个函数,返回一个void指针,在C语言中,void指针可以
* 指向任何类型
*/
void *func(){
    /*
     * 一种很容易犯的错误,将局部变量的地址返回
     */
    int m;
    printf("define as void *func()\n");
    return &m;
}

/*
* 声明一个指向函数的指针,指向返回类型为void指针的函数
*/
void *(*pfunc)();
/*
void (*pfun)();
* 声明一个函数,指向一个返回void的函数。其实这个和第一种
* void *func()是大多数人最容易混淆的方式。总结中会介绍
* 分辨的方法。因为这种指针前面已经说过,这里不举例。
*/

int main(){
    int *result;
    pfunc=func;/*赋值*/
    result=(int *)func();/*将void*转换成int**/
    func();
    pfunc();

    return 0;
}

/*
* 编译上面这个程序,能够“正常”通过,但是会得到警告:返回了临时局部变量
* 地址,因为局部变量放在栈中,在函数结束时会被自动释放,如果你真的想要
* 在函数中使用局部变量来返回,那么可以使用malloc来分配内存地址,malloc
* 分配的内存属于进程的堆段,需要自己释放,或者程序运行结束后由C运行时
* 来释放。
* 最后,说说怎样区分下面这两个东东
*        char *func();
*        char (*func)();    
*        记住函数()的结合性比指针*高,就可以很容易区分了,因为()高于*,所以
*        char *func()中的变量func是一个函数,进一步和普通函数char func()对比
*        你就可以将char *func()中的char *看成是有一个括号括起来了。而
*        char (*func)()中的func,由于加了括号,所以先和指针*结合,变成一个
*        指针,正如普通函数char function()中的function其实也是一个函数指针
*        一样,所以你可以将(*func)当成是一个普通变量。
*/
相关文章
|
24天前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
24天前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
1月前
利用指针函数
【10月更文挑战第2天】利用指针函数。
17 1
|
1月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
23 2
|
5月前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
2月前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
3月前
|
程序员 C语言
指针在函数参数和返回值中的使用
指针在函数参数和返回值中的使用
47 9
|
3月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
5月前
|
编译器 C++
函数指针和函数对象不是同一类型怎么替换
函数指针和函数对象不是同一类型,为何可替换用作同一函数的参数
|
5月前
|
存储 C语言
C语言的函数返回值和指针
C|函数返回值(区分各类值)和指针(区分各类存储空间)的细节