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

以下是对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

时间: 2024-12-20 17:54:35

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

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

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

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

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

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

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

struct-C语言typedef声明问题

问题描述 C语言typedef声明问题 请问为什么第一种声明编译是通不过错的,第二种是正确的.第一种:typedef Node *List;//两者仅第一句不同typedef struct LNode { int Data[40]; struct LNode * Last;} Node ;第二种:typedef struct LNode *List;typedef struct LNode { int Data[40]; struct LNode * Last;} Node ; 解决方案 typ

c语言-这个C语言函数声明意思?

问题描述 这个C语言函数声明意思? 编写一个函数,该函数将一个unsignedint中的所有位向左旋转指定数量的位.例如,rotate_l(x,4)将x中的所有位向左移动4个位置,而且从左端丢失的位会重新出现在右端.也就是说,把从高位移出的位放入低位.在程序中测试该函数. int rotate_l(unsigned int number, unsigned int bit) { unsigned int i; unsigned int hign = 8 * sizeof(unsigned int

详解C语言编程中的函数指针以及函数回调_C 语言

函数指针: 就是存储函数地址的指针,就是指向函数的指针,就是指针存储的值是函数地址,我们可以通过指针可以调用函数. 我们先来定义一个简单的函数: //定义这样一个函数 void easyFunc() { printf("I'm a easy Function\n"); } //声明一个函数 void easyFunc(); //调用函数 easyFunc(); //定义这样一个函数 void easyFunc() { printf("I'm a easy Function\n

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

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

C语言中字符串常用函数strcat与strcpy的用法介绍

以下是对C语言中字符串常用函数strcat与strcpy的使用方法进行了详细的分析介绍,需要的朋友可以参考下   strcpy原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include <string.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针.函数实现: 复制代

方法-C语言头文件里放声明,其实现放哪?

问题描述 C语言头文件里放声明,其实现放哪? 我写了一个头文件a.h,实现在a.c中,主文件中#include "a.h",报错...我想知道头文件的声明和定义的规范使用方法..谢谢.. 解决方案 首先搞清楚,include和头文件的关系. include的作用是将这个文件的内容插入到include所在的位置,从而构成一个完整的源代码文件被编译. 那么头文件是什么,实际上头文件里可以放任何东西,源代码文件也可以放任何东西,include也可以随意包含. 只是看这三者放在一起,经过替换,