#include int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); }
今天做到一题面试题如下, 读到第9行的时候发现和自己理解的有出入。
个人理解函数名是函数的入口地址就是一个人指针,那为什么还要取地址再赋值给p呢?
带着疑惑百度了一番,发现网上没人发现程序中的问题,所以就记录一下,希望以后做到这题的同学不再被误解。
错误
//代码为网上复制的,存在许多问题
//运行的结果提示: 程序中有游离的‘\343’等一系列错误
#include <stdio.h>
int inc(int a)
{ return(++a); }
int multi(int*a,int*b,int*c)
{ return(*c=*a**b); }
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);
void show(FUNC2 fun,int arg1, int*arg2)
{ FUNC1 p=&inc; int temp =p(arg1); fun(&temp,&arg1, arg2); printf("%dn",*arg2);
}
main()
{ int a; show(multi,10,&a); return 0;
}
于是自己手打了一遍:
#include <stdio.h>int inc(int a)
{return (++a);
}int multi(int * a, int * b, int *c)
{return (*c = *a * *b);
}typedef int(FUNC1)(int in);
typedef int(FUNC2)(int *,int *,int *);void show(FUNC2 fun,int arg1,int * arg2)
{FUNC1 p = &inc;int temp = p(arg1);fun(&temp,&arg1,arg2);printf("%d\n",*arg2);
}
int main()
{int a;show(multi,10,&a);return 0;
}
//编译结果错误为:
//test.c: 在函数 ‘show’ 中:
//test.c:26: 错误:函数 ‘p’ 像变量一样被初始化
分析:
FUNC1 p = &inc;
左: 定义一个形参为int型,返回值为int型的函数p(p为函数的入口地址)。
右: 将函数inc()的入口地址 取 地址;
左右明显是不同的数据类型。
修改
//方法一:
#include <stdio.h>int inc(int a)
{return (++a);
}int multi(int * a, int * b, int *c)
{return (*c = *a * *b);
}typedef int(*FUNC1)(int in); //此时FUNC1变成了指向函数的指针
typedef int(FUNC2)(int *,int *,int *);void show(FUNC2 fun,int arg1,int * arg2)
{FUNC1 p = &inc;
// FUNC1 p = inc; 这样写也是对的,不知道如何理解。
// 个人理解: 像int a[10]一样 , a和&a 是一个地址 int temp = p(arg1);fun(&temp,&arg1,arg2);printf("%d\n",*arg2);
}
int main()
{int a;show(multi,10,&a);return 0;
}
//方法二:
#include <stdio.h>int inc(int a)
{return (++a);
}int multi(int * a, int * b, int *c)
{return (*c = *a * *b);
}typedef int(FUNC1)(int in);
typedef int(FUNC2)(int *,int *,int *);void show(FUNC2 fun,int arg1,int * arg2)
{FUNC1 *p = &inc; //定义一个指针p指向一个形参为int型,返回值为int型的函数 int temp = p(arg1);fun(&temp,&arg1,arg2);printf("%d\n",*arg2);
}
int main()
{int a;show(multi,10,&a);return 0;
}
问题
//为什么在typedef int(FUNC2)(int *,int *,int *);的FUNC前加*程序也是对的
//请看到这篇文章的同学,帮我一下,谢谢。
//如下:
#include <stdio.h>int inc(int a)
{return (++a);
}int multi(int * a, int * b, int *c)
{return (*c = *a * *b);
}typedef int(FUNC1)(int in);
typedef int(*FUNC2)(int *,int *,int *);void show(FUNC2 fun,int arg1,int * arg2)
{FUNC1 *p = &inc; //定义一个指针p指向一个形参为int型,返回值为int型的函数 int temp = p(arg1);fun(&temp,&arg1,arg2);printf("%d\n",*arg2);
}
int main()
{int a;show(multi,10,&a);return 0;
}
#include int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); }相关推荐
- Java中int型如何求幂_关于java:为什么Math.pow(int,int)慢于我的幼稚实现?
昨天我看到一个问题,问为什么Math.pow(int,int)这么慢,但是问题措辞不佳,没有进行任何研究,因此很快就关闭了. 我做了一些自我测试,发现与整数参数相比,Math.pow方法实际上比我自己 ...
- php 类中调用另类,PHP return语句另类用法不止是在函数中,return语句_PHP教程
PHP return语句另类用法不止是在函数中,return语句 分享下PHP return语句的另一个作用,在bbPress的代码中看到的一个奇葩使用方法. 一直以为,return只能出现在函数中, ...
- js获取int类型长度_js代码比较大小前需要把string转换int
今天在写代码时发现一个容易忽略的问题,写下来以供参考 这是做的一个验证,设置的最小值minValue不能小于参数本身的最小值min 当输入正数的时候都没有问题,但是输入负数时就出现问题了 正确设置参数 ...
- c语言 int a 5,在C语言中,有如下的写法:int a = 5; int *pa; pa = (a + 1);
pa = &(a+1)这一句不对. a是一个变量,a+1是一个数值,无法再通过在前面加"&"获得一个地址.有的编译器可以用&(int )(a+1)的方式强制 ...
- python 小于等于号不支持int string_为什么这个Python String的大小会在失败的int转换中发生变化...
在Python 3.6中将字符串转换为int的代码请求使用字符串的UTF-8形式: buffer = PyUnicode_AsUTF8AndSize(asciidig, &buflen); 并 ...
- byte数组转int数组 java_如何把一个byte数组的数字转换成int
这里简单记录下两种转换方式: 第一种: 1.int与byte[]之间的转换(类似的byte short,long型) [java] view plain copy /** * 将int数值转换为占四个 ...
- C++ int/char转string/char数组格式化给char数组赋值(int,char,double)
int和char字符串格式化转换成string的代码如下: char *temp=new char[10];sprintf(temp,"(%s %d)",lei,num);//格式 ...
- mysql int 做排序_Mysql数据库按照varchar字符串类型排序和按照int整型类型排序的区别和注意点及解决方案...
自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为int(2)的.因为我只允许输出数字.这本来也没什么,无非就是占点空间,懒得改了.但是今天在后台发现排序有问题.于是,没办法,改 ...
- int** 赋值_一篇文章搞明白Integer、new Integer() 和 int 的概念与区别
基本概念的区分 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2.Integer 变量必须实例化后才能使用,而int变量不需要 3.Integer 实际是对象的 ...
- python中int函数是什么作用_【后端开发】python中int函数怎么用
int() 函数用于将一个字符串会数字转换为整型.接下来通过本文给大家介绍python 中的int()函数的相关知识,感兴趣的朋友一起看看吧 int(x, [base]) 功能: 函数的作用是将一个数 ...
最新文章
- 中文NLP的分词真有必要吗?李纪为团队四项任务评测一探究竟 | ACL 2019
- 网站Web服务器测试及优化参考
- windowsDOS命令
- Matalab类定义
- Css Secret 案例Demo全套
- mysql不区分大小写设置_mysql设置不区分大小写
- 【Python】Matplotlib绘图中文乱码问题的解决方案
- extjs 中登录保存用户名
- ubuntu未发现wifi适配器_Windows 10 9月更新频翻车,1903版本网络适配器又出bug
- spring中for循环中事务
- XenApp/XenDesktop 7.12新功能LHC解读
- 【形状检测】基于matlab Hough变换形状检测【含Matlab源码 468期】
- Android轮播图代码
- cmd xcopy 拷贝文件夹_如何使用Xcopy复制文件夹及其子文件夹?
- Python编程通过出生日期判断星座
- 社会软件力量:六度分隔理论
- ESX修复Linux虚拟机重启只读模式
- Layui的基本使用(前端登录操作步骤)
- STOP 0X00000018关机蓝屏重启问题
- matlab编写扫雷,【matlab编程】Matlab版扫雷
热门文章
- 计算机在物理学中应用论文3000字,大学物理论文3000字
- java和基岩版凋零打法,六种凋零打法介绍 凋零还可以这么打
- 教你科学实施有氧运动
- 结构方程模型(SEM)及其R实现
- csdn博客名字修改
- 部分iphone机型无法实现css的animation动画效果(无效, 失效)
- 在Linux系统(CentOS 8.2)腾讯云服务器下部署原神云崽机器人(Yunzai-Bot)【保姆入门级】
- 通信行业基础知识大全
- KKT条件(Karush-Kuhn-Tucker)及二阶充分条件(The second-order sufficiency condition)
- centos7 xfs分区重调整