当前位置: 首页 > news >正文

指针函数和函数指针

函数名在表达式中应该如何被解读?答:函数名可以在表达式中被解读成“指向该函数的指针”。

函数指针和指针函数有什么区别?答:函数指针是一个指向函数的指针;指针函数是一个返回指针变量的函数。

一个函数能否有时候返回整型指针,有时候返回字符指针?答:能,定义一个 void * 类型的指针函数。

#include <stdio.h>

void *func(int n, int *ptr, char *str);

void *func(int n, int *ptr, char *str)
{
        if (n > 0)
        {
                return ptr;
        }
        else
        {
                return str;
        }
}

int main(void)
{
        int num = 520;
        char *str = "FishC";

        printf("%d\n", * (int *) (func(1, &num, str)));
        printf("%s\n", (char *) func(-1, &num, str));

        return 0;
}

请问下面代码存在什么问题?

#include <stdio.h>

int *func(int n);

int *func(int n)
{
        n++;

        return &n;
}

int main(void)
{
        printf("%d\n", *func(520));

        return 0;
}

答:上面代码试图返回形参的地址,这跟返回局部变量的地址一样是错误的!因为形参和局部变量在程序运行的时候都是存放在栈中,函数一旦结束调用,栈的空间即释放(虽然不是立刻释放,但其内存空间随时会被覆盖),所以大家跟我一起大声读出来:不要返回局部变量的指针

有一个指针函数 a,它的返回一个字符串,它有两个参数 b 和 c,其中 b 是一个字符串,c 是一个指向参数为 int 类型,返回值为 void 类型的函数指针。那么……请写出指针函数 a 的声明。

char *a ( char *b, void (*c) (int) );

请解释下面代码中 func 是个什么东东?void ( *func ( int, void (*) (int) ) ) (int)

答:解这种题,除非你对指针特别熟练,否则请从最里边的小括号开始分析。

  • void (*) (int) 是一个函数指针(没有名字),它指向一个参数为 int 类型,返回值为 void 类型的函数
  • func ( int, void(*) (int) ) 可以写成 func (int, 函数指针) 的形式
  • func 也是一个函数,它有两个参数,返回值是一个函数指针 void (*) (int)
  • 总结:func 是一个返回值为函数指针(指向一个参数为 int 类型,返回值为 void 类型的函数)的函数,func 有两个参数,第一个参数是 int 类型,第二个参数为函数指针(指向一个参数为 int 类型,返回值为 void 类型的函数)
  • 注:这道题除了考察你对C语言指针的理解程度之外,几乎没有任何作用,在实际开发中,请不要写这样的代码折腾你的同事……
http://www.lryc.cn/news/409429.html

相关文章:

  • Elasticsearch跨集群搜索
  • 基于FPGA的数字信号处理(19)--行波进位加法器
  • 树莓派下,centos7操作系统, TensorFlow java版实现植物分类功能
  • 开源一个react路由缓存库
  • go-kratos 学习笔记(7) 服务发现服务间通信grpc调用
  • SPSS个人版是什么软件
  • Minos 多主机分布式 docker-compose 集群部署
  • Unity + Hybridclr + Addressable + 微信小程序 热更新报错
  • 鸿蒙开发—黑马云音乐之Music页面
  • IsaacLab | 如何在Manipulation任务中添加新的目标(target)
  • 【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)
  • Linux(虚拟机)的介绍
  • CSS(九)——CSS 轮廓(outline)
  • Unity Timeline:构建复杂动画序列的利器
  • C# 与C++ cli
  • Linux文件编程--打开及创建
  • Vue3点击按钮实现跳转页面并携带参数
  • 探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6
  • SpringBoot中使用监听器
  • mybatise全接触-面试宝典-知识大全
  • Catalyst优化器:让你的Spark SQL查询提速10倍
  • 【Hot100】LeetCode—416. 分割等和子集
  • 前端开发知识-vue
  • 【嵌入式硬件】快衰减和慢衰减
  • C语言 | Leetcode C语言题解之第275题H指数II
  • 速盾:网络安全和 CDN 之间的关系是怎样的?
  • 数据库安全:MySQL安全配置,MySQL安全基线检查加固
  • 【SpringBoot】参数传递
  • Unity 骨骼动画(Skinned Mesh Renderer): 角色动画的高级渲染
  • 花几千上万学习Java,真没必要!(三十四)