c复杂函数指针
函数指针,函数的返回值是数组
int *(*(*fun)(int* a, int* b))[];
上面的代码是声明一个函数指针,这个函数有2个int指针参数,返回值是指针,指向的是数组,数组里放的是int指针。但是,实际用代码验证一下,并不是想象的那样。
结论:只要参数一样,返回值不管是int指针数组,int数组,还是int,编译都会通过,执行没有问题。但是编译时有警告:【initialization makes integer from pointer without a cast [-Wint-conversion]】
#include <stdio.h>
#include <stdlib.h>
//这个函数有2个int指针参数,返回值是指针数组,数组里放的是int指针,按理说应该和上面声明的函数指针是匹配的,其实地下的arr和arr1也可以和它匹配。
int **arr3(int* a, int* b){
//因为要返回的是指针数组,所以用二级指针
int **p = (int**)malloc(sizeof(int*) * 2);
p[0] = a;
p[1] = b;
return p;
}
//这个函数有2个int指针参数,返回值是数组,数组里面放的是int,按理说应该和上面声明的函数指针是不匹配的,但是可以匹配
int *arr(int* a, int* b){
printf("%d, %d\n",*a,*b);
int *p = (int*)malloc(sizeof(int) * 2);
p[0] = *a;
p[1] = *b;
return p;
}
//这个函数有2个int指针参数,返回值是int,按理说应该和上面声明的函数指针是不匹配的,但是可以匹配
int arr1(int* a,int* b){
return 100;
}
//这个函数有1个int指针参数,返回值是int,按理说应该和上面声明的函数指针是不匹配的,确实不匹配,编译不过
int arr2(int* a){
return 200;
}
//返回的是数组指针,指向的数组是int[2](和最上面声明的函数指针没有关系)
int (*getAr())[2]{
int (*p)[2] = (int(*)[2])calloc(2, sizeof(int));
for(int i = 0; i < 2; ++i){
(*p)[i] = i;
}
return p;
}
int main(){
int a = 10;
int b = 20;
//接受 getAr()的例子
int (*p)[2] = getAr();
for(int i = 0; i < 2; ++i){
printf("%d ", (*p)[i]);
}
printf("\n");
int *(*(*fun)(int* a, int* b))[];
//编译有警告但是可以通过
fun = &arr;
int *c = (*fun)(&a,&b);
printf("c[0] = %d\n",c[0]);
printf("c[1] = %d\n",c[1]);
//编译有警告但是可以通过
fun = &arr1;
int d = fun(&a,&b);
printf("d = %d\n",d);
//编译不过,因为参数不一样
//fun = &arr2;
// int e = fun(&a);
//printf("e = %d\n",e);
//编译有警告但是可以通过
fun = &arr3;
int **f = (*fun)(&a,&b);
printf("f[0] = %p\n",f[0]);
printf("f[0] = %p\n",f[1]);
printf("*f[0] = %d\n",*f[0]);
printf("*f[1] = %d\n",*f[1]);
}
执行结果:
0 1
10, 20
c[0] = 10
c[1] = 20
d = 100
f[0] = 0x7ffef9c9c4f8
f[0] = 0x7ffef9c9c4fc
*f[0] = 10
*f[1] = 20
c复杂函数指针的更多相关文章
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- 为什么 C++ 中成员函数指针是 16 字节?
当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小.例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pushes a ...
- C++函数指针总结
学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了.本博文详细介绍一下常见的各种坑爹的函数指针. 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函 ...
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- 结构体内嵌函数指针实现C语言面向对象
结构体内嵌函数指针 #include<stdio.h> void say(int age) { printf("我%d岁了\n",age); } struct stud ...
- 用typedef定义函数指针的问题
在学习windows API的时候,遇到下面这段代码 以前见过的typedef的用法都是给一个数据类型取一个别名 typedef oldTypeName newTypeName 这种给数据类型 ...
- 你必须知道的指针基础-7.void指针与函数指针
一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...
- objective-c中的@selector()和 c /c++的函数指针
先看tomcat里用到的代码: //然后开始动画 //把图片放到animationImages,接受数组参数 self.tom.animationImages = arrayImage; //设置时间 ...
- C++基础——函数指针 函数指针数组
==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...
- QT中使用函数指针
想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...
随机推荐
- spring-boot(八) springboot整合shiro-登录认证和权限管理
学习文章:springboot(十四):springboot整合shiro-登录认证和权限管理 Apache Shiro What is Apache Shiro? Apache Shiro是一个功能 ...
- Java设计模式学习记录-状态模式
前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...
- zabbix实现百台服务器的自动化监控--技术流ken
前言 最近有小伙伴通过Q联系到我说:公司现在有百多台服务器,想要部署zabbix进行监控,怎么实现自动化全网监控? 本篇博客将讲解一个我工作时做的一个实际项目,现在写出来供大家以后参考使用. 实现自动 ...
- MySQL系列详解二:MySQL语句操作-技术流ken
简介 本篇博客将详细讲解mysql的一些常用sql语句操作,例如创建数据库,删除数据库,创建表,修改表,删除表,以及简单查询案例. 关于mysql数据中的SQL的大小写问题 1.不区分大小写 1. s ...
- Hive环境搭建及测试
前提条件:已经安装好如下软件 Eclipse4.5 hadoop-2.7.3 jdk1.7.0_79 此篇文章基于上一篇文章:zookeeper高可用集群搭建 什么是Hive? 1.Hive是一个基 ...
- iOS SQLite详解
这周比较忙,前几天都加班到11点左右,基本都是到家都是12点左右(稍稍的抱怨一下,免费加班,何为免费,就是任何补偿都没有,例如调休,加班薪,餐补等各项福利,是一点都没有呀)因为App要上线了!App上 ...
- MVC学习之路(1) EF 增删查改合集
首先再Model中创建一个类[WMBlogDB] public class WMBlogDB : DbContext { //连接字符串. public WMBlogDB() : base(" ...
- [android] 保存文件到SD卡
/****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...
- [android] 自定义广播事件
上一节的短信拦截在4.0以上系统中无效,可以使用这种办法实现,定义一个activity,清单文件中指定主题为透明,在onCreate()方法里面直接调用finsh()方法,关掉,这样可以就可以实现了 ...
- 24.QTableView函数使用,右击菜单实现
QTableView view(this); QStandardItemModel model(this); /*设置表头水平标题*/ model.setHorizontalHeaderItem(,n ...