C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。

起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:

struct stu stu1;

struct 看起来就是多余的,但不写又会报错。如果为 struct stu 起了一个别名 STU,书写起来就简单了:

STU stu1;

这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名。

使用关键字 typedef 可以为类型起一个新的别名,语法格式为:

typedef  oldName  newName;

oldName 是类型原来的名字,newName 是类型新的名字。例如:

typedef int INTEGER;

INTEGER a, b;

a = 1;

b = 2;

INTEGER a, b;等效于int a, b;。

typedef 还可以给数组、指针、结构体等类型定义别名。先来看一个给数组类型定义别名的例子:

typedef char ARRAY20[20];

表示 ARRAY20 是类型char [20]的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组:

ARRAY20 a1, a2, s1, s2;

它等价于:

char a1[20], a2[20], s1[20], s2[20];

注意,数组也是有类型的。例如char a1[20];定义了一个数组 a1,它的类型就是 char [20],这一点已在VIP教程《数组和指针绝不等价,数组是另外一种类型》中讲解过。

又如,为结构体类型定义别名:

typedef struct stu{

char name[20];

int age;

char sex;

} STU;

STU 是 struct stu 的别名,可以用 STU 定义结构体变量:

STU body1,body2;

它等价于:

struct stu body1, body2;

再如,为指针类型定义别名:

typedef int (*PTR_TO_ARR)[4];

表示 PTR_TO_ARR 是类型int * [4]的别名,它是一个二维数组指针类型。接着可以使用 PTR_TO_ARR 定义二维数组指针:

PTR_TO_ARR p1, p2;

按照类似的写法,还可以为函数指针类型定义别名:

typedef int (*PTR_TO_FUNC)(int, int);

PTR_TO_FUNC pfunc;

【示例】为指针定义别名。

#include

typedef char (*PTR_TO_ARR)[30];

typedef int (*PTR_TO_FUNC)(int, int);

int max(int a, int b){

return a>b ? a : b;

}

char str[3][30] = {

"http://c.biancheng.net",

"C语言中文网",

"C-Language"

};

int main(){

PTR_TO_ARR parr = str;

PTR_TO_FUNC pfunc = max;

int i;

printf("max: %d\n", (*pfunc)(10, 20));

for(i=0; i<3; i++){

printf("str[%d]: %s\n", i, *(parr+i));

}

return 0;

}

运行结果:

max: 20

str[0]: http://c.biancheng.net

str[1]: C语言中文网

str[2]: C-Language

需要强调的是,typedef 是赋予现有类型一个新的名字,而不是创建新的类型。为了“见名知意”,请尽量使用含义明确的标识符,并且尽量大写。

typedef 和 #define 的区别

typedef 在表现上有时候类似于 #define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把 typedef 看成一种彻底的“封装”类型,声明之后不能再往里面增加别的东西。

1) 可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做。如下所示:

#define INTERGE int

unsigned INTERGE n;  //没问题

typedef int INTERGE;

unsigned INTERGE n;  //错误,不能在 INTERGE 前面添加 unsigned

2) 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。例如:

#define PTR_INT int *

PTR_INT p1, p2;

经过宏替换以后,第二行变为:

int *p1, p2;

这使得 p1、p2 成为不同的类型:p1 是指向 int 类型的指针,p2 是 int 类型。

相反,在下面的代码中:

typedef int * PTR_INT

PTR_INT p1, p2;

p1、p2 类型相同,它们都是指向 int 类型的指针。

以上就是对 C语言typedef 的资料整理,谢谢大家对本站的支持!

c语言typedef怎么自定义函数,C语言 typedef:给类型起一个别名相关推荐

  1. c语言何编写自定义函数,C语言菜鸟基础教程之自定义函数

    C语言菜鸟基础教程之自定义函数 先动手编写程序: #include int add(int x, int y) { int z = x + y; return z; } int main() { in ...

  2. C语言入门系列 - 自定义函数

    C语言入门系列 - 自定义函数 第一节 C 语言基础以及基本数据类型 第二节 C 语言运算符 第三节 C 语言控制语句 第四节 C 语言自定义函数 第五节 C 语言修饰变量的关键字 第六节 C 语言构 ...

  3. C语言:1027.自定义函数求最大公约数和最小公倍数

    C语言:1027.自定义函数求最大公约数和最小公倍数 题目描述: 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入. 解题思路: 1.利用辗转相 ...

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

    C语言typedef:给类型起一个别名 C语言允许为一个数据类型起一个新的别名,起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样 ...

  5. 多元统计分析及R语言建模_自定义函数: msaR.R

    #*********************************************** #****** 多元统计分析及R语言建模(第五版)****** #****** 自定义函数: msaR ...

  6. 最小值c语言编写自定义函数,C语言笔记55:自定义函数[老九学堂]

    函数定义 return_type function_name ([datetype1 arg1],[datype2 arg2,[...]){ //函数体 } 函数三要素返回值类型 函数名 参数列表 书 ...

  7. c语言指针自定义函数,c语言函数指针定义,指针函数和函数指针的区别

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面就由小编详细为大家介绍C语言中函数指针,指针函数和函数指针之间的区别. c语言指针函数定义: 函数指针是指向函数的指针变量. 因此&qu ...

  8. c语言模板函数调用自定义函数调用,C语言函数的递归和调用

    C语言函数的递归和调用Tag内容描述: 1.计算机科学系陈垚,1,张福祥主编辽宁大学出版社,C语言程序设计,计算机科学系陈垚,2,我们先看这样一个例子:,说有一只调皮的小猴子,摘了一堆水果,第一天吃了 ...

  9. 按键精灵Q语言-怎么使用自定义函数返回值

    按键精灵怎么使用自定义函数返回值? a i MessageBox i Function a(i) i=100 End Function 就是想弹出100 aiMessageBoxiFunctiona( ...

最新文章

  1. 护壁桩嵌入深度_泥浆护壁成孔灌注桩施工时泥浆的作用有哪些?
  2. 子域名绑定html,DEDE二级域名(多站点)绑定详解
  3. [推荐推荐][提供下载]ORACLE SQL:经典查询练手系列文章收尾(目录篇)
  4. 12306订票候补是个坑_加30元就能抢到火车票?12306这个功能更靠谱!今起可买除夕火车票,抢票高峰来了...
  5. apply_async进程不执行_c/c++面试精选题(八)简单回答,进程和线程关系及区别...
  6. Ubuntu Server中怎样卸载keepalived
  7. 前端下载二进制流文件
  8. 网页编程从入门到精通 杨凡_学习计划丨西门子S7200编程从入门到精通
  9. SetRegistryKey的作用
  10. 惠普服务器查询ilo信息,Hp服务器iLO IML硬件日志收集与远程巡检
  11. 全球仅3000人通过的TensorFlow开发人员认证到底有多香!
  12. 人工智能写小说python_1月下旬值得一读的10本技术新书(人工智能、C++、Python数据科学等)!文末有福利!...
  13. MSN登录问题:Error 80072ee7
  14. ubuntu LVS+keepalived 笔记
  15. 使用 github + jekyll 搭建个人博客
  16. 双线性对在密码学中的应用(下)
  17. android水下气泡,科学网—水下爆炸气泡的基本现象及规律 - 黄超的博文
  18. Springboot+easyUI filebox实现单个文件上传
  19. Python绘制折线图
  20. Android H5视频全屏,自适应视频

热门文章

  1. 关于各种PLMN的选择
  2. IBM V系列存储常用命令
  3. 电脑计算机提示msvcp110.dll文件丢失的解决办法
  4. 通信专业技术人员职业水平考试报考指南
  5. WebKit之V8技术优化分析
  6. 数据结构之完全二叉树
  7. CentOS7.0基于hadoop集群安装配置Hive
  8. 叶子云桌面虚拟化解决方案100-200用户
  9. Qt:46---QPainter绘图之QPen、QBrush、QFont工具
  10. LLVM是如何编译指令的