C语言typedef与复杂函数声明问题的深入解析

下面是三个变量的声明,我想使用typedef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。

>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];
a是一个包含5个元素的数组,数组的元素是函数指针,该函数指针所指函数的的返回值是指向int类型的指针,输入参数有两个,第一个是int,第二个是char*

>2:void (*b[10]) (void (*)());
//首先为上面表达式红色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];
b是一个含有10个元素的数组,每个元素都是一个函数指针,该函数指针所指的函数的返回值为void,输入参数为另一个函数指针,这个函数指针没有输入参数,返回值为void

>3. doube(*)() (*pa)[9];
//首先为上面表达式红色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9];
pFunParam pa;

pa是个指针,指针指向一个含有9个元素的数组,数组的元素是一个函数指针,函数指针所指函数没有输入参数,返回值为double

(0)

相关推荐

  • C语言中函数声明与调用问题

    假如函数在调用它之前定义可以不用声明 实际上,如果在函数调用前,没有对函数作声明,则编译系统会吧第一次遇到的该函数的形式(函数定义或者函数调用)作为函数的声明,并将函数默认值类型认为int型 比如有您调用的是void max(int a,int b)系统就会把该函数当做int max(int a,int b);

  • C语言中的隐式函数声明

    1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int argc, char** argv) { double x = any_name_function(); return 0; } 单纯的编译上述源代码,并没有任何报错,只是在链接阶段因为找不到名为any_name_function的函数体而报错. [smstong@centos192 test]$

  • C语言typedef与复杂函数声明问题的深入解析

    下面是三个变量的声明,我想使用typedef分别给它们定义一个别名,请问该如何做?>1:int *(*a[5])(int, char*);>2:void (*b[10]) (void (*)());>3. doube(*)() (*pa)[9];答案与分析:对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了. >1:int *(*a[5])(int, char*);//pFun是我们建的一个类型

  • Linux下C语言的fork()子进程函数用法及相关问题解析

    fork fork()函数是linux下的一个系统调用,它的作用是产生一个子进程,子进程是当前进程的一个副本,它跟父进程有一样的虚存内容,但也有一些不同点. 但是,值得注意的是,父进程调用fork()后,fork()返回的是生成的子进程(如果能顺利生成的话)的ID.子进程执行的起点也是代码中fork的位置,不同的是下面这段C语言代码展示了fork()函数的使用方法: // myfork.c #include <unistd.h> #include <stdio.h> int mai

  • 全面了解函数声明与函数表达式、变量提升

    函数的声明方式 在定义一个函数的时候通常有两种声明方式: foo(){}; // 函数声明 var foo = function(){}; // 函数表达式 不同之处 1.函数表达式后面加括号可以直接执行 2.函数声明会提前预解析 预解析 让我们先看一个例子: foo(); // 函数声明 foo_later(); // foo_later is not a function function foo(){ console.log('函数声明'); } var foo_later = funct

  • C语言函数声明以及函数原型超详细讲解示例

    C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错.但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明. 所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上. 函数声明的格式非常简单,相当于去掉函数定义中的函数体,并在最后加上分号;,如下所示: dataType functionName( dataType1 param1, dataType2 param2 ... ); 也

  • C语言 typedef:给类型起一个别名

    C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写: struct stu stu1; struct 看起来就是多余的,但不写又会报错.如果为 struct stu 起了一个别名 STU,书写起来就简单了: STU stu1; 这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名. 使用关键字 typede

  • C语言可变参数与函数参数的内存对齐详解

    目录 什么是可变参数? 使用可变参数 函数参数的内存对齐 总结 什么是可变参数? 有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数. C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数. 比如我们最常用的printf函数,它的函数声明是:int printf(const char *format, ...);该函数就是一个典型的应用可变参数的实例,后面那三个...就是说明该函数是可变参数函数. 使用可变参数 要使用可变

  • Go语言中的延迟函数defer示例详解

    前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.return.返回值.panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!话不多说了,来一起看看详细的介绍吧. 先来运行下面两段代码: A. 匿名返回值的情况 package main import ( "fmt&qu

  • Go语言的变量、函数、Socks5代理服务器示例详解

    Go语言中变量的声明和JavaScript很像,使用var关键字,变量的声明.定义有好几种形式 1. 变量和常量 // 声明并初始化一个变量 var m int = 10 // 声明初始化多个变量 var i, j, k = 1, 2, 3 // 多个变量的声明(注意小括号的使用) var( no int name string ) // 声明时不指明类型,通过初始化值来推导 var b = true // bool型 // := 隐含声明变量并赋值 str := "mimvp.com"

  • C语言中调用Swift函数实例详解

    C语言中调用Swift函数实例详解 在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类.在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提.这里我就为大家分享一下如何在C语言中调用Swift函数. 我们首先要知道的是,所有Swift函数都属于闭包.其次,Swift函数的调用约定与

随机推荐