1.0关于typedef关键字的基础:

  https://www.cnblogs.com/anSn/p/8783347.html

1.1 typedef 修饰“函数类型” 的调用方法:

1)我们写一段普通的函数调用:

#include<stdio.h>
int add(int a,int b); void main()
{
int d=;
d=add(,);
printf("d=%d\n",d);
}
int add(int a,int b)
{
return a+b;
}

  运行结果如下:

  

2)我们引入typedef去修饰“函数函数类型”,并调用起来:

#include<stdio.h>
typedef int fun(int,int); fun add;//等价 int add(int a,int b);
void main()
{
int d=;
d=add(,);
printf("d=%d\n",d);
}
int add(int a,int b)
{
return a+b;
}

运行结果如下:

  

1.2  typedef修饰“函数指针类型”的调用方法:

1)首先,不引入typedef,写一段函数指针的定义,并指向一个函数调用起来:

#include<stdio.h>

int add(int a,int b);

int main()
{
int d=;
int (*p)(int,int);//定义一个函数指针。 p=add;//指针P指向一个函数地址 也可以p=&add; 结果一致的
d=p(,);//用指针调起函数 printf("d=%d\n",d);
return ;
}
int add(int a,int b)
{ return a+b;
}

运行结果如下:

2)引入typedef修饰“函数类型”,并结合指针构成函数指针后去调用函数:

#include<stdio.h>
typedef int fun(int,int);//给一个函数类型取一个别名,别名为fun int add(int a,int b); int main()
{
int d=;
fun *p;//int (*p)(int,int);//定义一个函数指针。 p=add;//指针P指向一个函数地址
d=p(,);//用指针调起函数 printf("d=%d\n",d);
return ;
}
int add(int a,int b)
{ return a+b;
}

运行结果如下:

3)typedef直接修饰“函数指针类型”,指向一个函数并调用起来:

#include<stdio.h>
typedef int (*fun)(int,int);//给一个“函数指针类型”取一个别名,别名为fun int add(int a,int b); int main()
{
int d=;
fun p;//int (*p)(int,int);//定义一个函数指针。 p=add;//指针P指向一个函数地址 也可以p=&add; 结果是一致的
d=p(,);//用指针调起函数 此为显示调用, 隐示调用为d=(*p)(1,2);两者结果是一致的。 printf("d=%d\n",d);
return ;
}
int add(int a,int b)
{ return a+b;
}

4)拓展:

 把一串代表函数入口地址的整形数 强转 成 “函数指针类型”,并送实参进行调用:

#include<stdio.h>
int add(int a,int b); void main()
{
int d=; printf("add函数的入口地址为:%p\n",add); //add 0x00401005 d=((int (*)(int,int))0x00401005)(,);//函数调用。等价d=add(1,9);
//0x00401005 是一个整型地址,先把它强转成函数指针类型 :int (*)(int,int),再送参数进行调用 printf("d=%d\n",d);
}
int add(int a,int b)
{
printf("add被执行了");
return a+b;
}

运行结果如下:

C之typedef应用的更多相关文章

  1. 19-typedef

    本文目录 一.typedef作用简介 二.typedef与指针 三.typedef与结构体 三.typedef与指向结构体的指针 四.typedef与枚举类型 五.typedef与指向函数的指针 六. ...

  2. #define与typedef在重定义类型中的区别

    #define 为完全的替换 typedef 重新定一个数据类型 eg #define charp1 char* typedef char* charp2charp1 a,b; //a char* b ...

  3. typedef

    第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...

  4. 用typedef定义函数指针的问题

    在学习windows API的时候,遇到下面这段代码   以前见过的typedef的用法都是给一个数据类型取一个别名 typedef oldTypeName newTypeName   这种给数据类型 ...

  5. C语言语法 typedef小结

    在总结typedef之前,先了解一个专业术语: 常量指针(const pointer):常量指针在定义的时候必须被初始化,而且一旦初始化完成,则它的值就不能再改变. int errNumb = 0; ...

  6. 如何理解typedef void (*pfun)(void)

    问题: 在刚接触typedef void (*pfun)(void) 这个结构的时候,存在疑惑,为什么typedef后只有一"块"东西,而不是两"块"东西呢?那 ...

  7. C及C++中typedef的简单使用指南

    又是在学数据结构的时候,发现了之前学习的知识遗忘很多,在发现对C/C++中关键字typedef的理解还是没有到位后,我翻阅了学C++用到的课本,又问了度娘,也看了不少关于typedef用法的博客.于是 ...

  8. [转]关于typedef的用法总结

    不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...

  9. typedef 和 #define 的区别

    本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...

  10. [转载]彻底弄清struct和typedef struct

    struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...

随机推荐

  1. [FUZZ]文件上传fuzz字典生成脚本—使用方法

    文件上传fuzz字典生成脚本-使用方法 原作者:c0ny1 项目地址:https://github.com/c0ny1/upload-fuzz-dic-builder 项目预览效果图: 帮助手册: 脚 ...

  2. Python常量类

    class _const: class ConstError(TypeError): pass class ConstCaseError(ConstError): pass def __setattr ...

  3. Java多线程相关的API方法以及作用摘要

    wait() 会让当前运行线程 阻塞,并释放对应的对象锁, 一般由当前线程持有的对象锁调用 x.wait(): 当前线程必须拥有此对象的monitor(即锁),才能调用此对象的wait()方法能让当前 ...

  4. Laravel中的Storage::disk

    Laravel中的Storage::disk 一.总结 一句话总结: Storage的disk的路径和file的路径都是一回事,都是config/filesystems.php配置文件中disks 比 ...

  5. git 代码版本回退

    1.查看 commit id 2.git reset --hard "dfdfdfdf" // commit id 3.git push -f -u origin 2.1.0 // ...

  6. scrapy 一些坑

    scrapy爬虫出现Forbidden by robots.txt # Obey robots.txt rulesROBOTSTXT_OBEY = False scrapy定时执行抓取任务 用cron ...

  7. jvm 命令使用调优 通过jstat、jmap对java程序进行性能调优

    转载:http://blog.csdn.net/jerry024/article/details/8507589 转载: https://blog.csdn.net/zhaozheng7758/art ...

  8. Web Application Framework

    ASP.NET Boilerplate https://github.com/aspnetboilerplate ASP.NET Boilerplate - Web Application Frame ...

  9. nginx配置socket连接

    author: headsen  chen date:  2019-08-08 18:52:36 notice :个人原创 Nginx通过在客户端和后端服务器之间建立隧道来支持WebSockets通信 ...

  10. Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...