C语言中typedef的用法有哪些?

typedef的用法有:1、为基本数据类型定义新的类型名;2、为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称;3、为数组定义简洁的类型名称;4、为指针定义简洁的名称。

C语言中typedef的用法有哪些?

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。

一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。

例如,C 语言在 C99 之前并未提供布尔类型,但我们可以使用 typedef 关键字来定义一个简单的布尔类型,如下面的代码所示:

typedef int BOOL;#define TRUE 1#define FALSE 0

定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示:

立即学习“C语言免费学习笔记(深入)”;

BOOL bflag=TRUE;

typedef的4种用法

在实际使用中,typedef 的应用主要有如下4种。

1、为基本数据类型定义新的类型名

也就是说,系统默认的所有基本类型都可以利用 typedef 关键字来重新定义类型名,示例代码如下所示:

typedef unsigned int COUNT;

而且,我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型,即:

typedef long double REAL;

在不支持 long double 的平台二上,改为:

typedef double REAL;

甚至还可以在连 double 都不支持的平台三上,改为:

typedef float REAL;

这样,当跨平台移植程序时,我们只需要修改一下 typedef 的定义即可,而不用对其他源代码做任何修改。其实,标准库中广泛地使用了这个技巧,比如 size_t 在 VC++2010 的 crtdefs.h 文件中的定义如下所示:

#ifndef _SIZE_T_DEFINED#ifdef  _WIN64typedef unsigned __int64    size_t;#elsetypedef _W64 unsigned int   size_t;#endif#define _SIZE_T_DEFINED#endif

2、为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称

以结构体为例,下面我们定义一个名为 Point 的结构体:

struct Point{    double x;    double y;    double z;};

在调用这个结构体时,我们必须像下面的代码这样来调用这个结构体:

struct Point oPoint1={100,100,0};struct Point oPoint2;

在这里,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上面的调用方法一样有保留字 struct,而不能像 int 和 double 那样直接使用 Point 来定义变量。现在,我们利用 typedef 定义这个结构体,如下面的代码所示:

typedef struct tagPoint{    double x;    double y;    double z;} Point;

在上面的代码中,实际上完成了两个操作:

1)、定义了一个新的结构类型,代码如下所示:

struct tagPoint{    double x;    double y;    double z;} ;

其中,struct 关键字和 tagPoint 一起构成了这个结构类型,无论是否存在 typedef 关键字,这个结构都存在。

2)、使用 typedef 为这个新的结构起了一个别名,叫 Point,即:

typedef struct tagPoint Point

因此,现在你就可以像 int 和 double 那样直接使用 Point 定义变量,如下面的代码所示:

Point oPoint1={100,100,0};Point oPoint2;

为了加深对 typedef 的理解,我们再来看一个结构体例子,如下面的代码所示:

typedef struct tagNode{    char *pItem;    pNode pNext;} *pNode;

从表面上看,上面的示例代码与前面的定义方法相同,所以应该没有什么问题。但是编译器却报了一个错误,为什么呢?莫非 C 语言不允许在结构中包含指向它自己的指针?

其实问题并非在于 struct 定义的本身,大家应该都知道,C 语言是允许在结构中包含指向它自己的指针的,我们可以在建立链表等数据结构的实现上看到很多这类例子。那问题在哪里呢?其实,根本问题还是在于 typedef 的应用。

在上面的代码中,新结构建立的过程中遇到了 pNext 声明,其类型是 pNode。这里要特别注意的是,pNode 表示的是该结构体的新别名。于是问题出现了,在结构体类型本身还没有建立完成的时候,编译器根本就不认识 pNode,因为这个结构体类型的新别名还不存在,所以自然就会报错。因此,我们要做一些适当的调整,比如将结构体中的 pNext 声明修改成如下方式:

typedef struct tagNode{    char *pItem;    struct tagNode *pNext;} *pNode;

或者将 struct 与 typedef 分开定义,如下面的代码所示:

typedef struct tagNode *pNode;struct tagNode{    char *pItem;    pNode pNext;};

在上面的代码中,我们同样使用 typedef 给一个还未完全声明的类型 tagNode 起了一个新别名。不过,虽然 C 语言编译器完全支持这种做法,但不推荐这样做。建议还是使用如下规范定义方法:

struct tagNode{    char *pItem;    struct tagNode *pNext;};typedef struct tagNode *pNode;

3、为数组定义简洁的类型名称

它的定义方法很简单,与为基本数据类型定义新的别名方法一样,示例代码如下所示:

typedef int INT_ARRAY_100[100];INT_ARRAY_100 arr;

4、为指针定义简洁的名称

对于指针,我们同样可以使用下面的方式来定义一个新的别名:

typedef char* PCHAR;PCHAR pa;

对于上面这种简单的变量声明,使用 typedef 来定义一个新的别名或许会感觉意义不大,但在比较复杂的变量声明中,typedef 的优势马上就体现出来了,如下面的示例代码所示:

int *(*a[5])(int,char*);

对于上面变量的声明,如果我们使用 typdef 来给它定义一个别名,这会非常有意义,如下面的代码所示:

// PFun是我们创建的一个类型别名typedef int *(*PFun)(int,char*);// 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);PFun a[5];

小心使用 typedef 带来的陷阱

接下来看一个简单的 typedef 使用示例,如下面的代码所示:

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);

在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?

答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char*const(一个指向char的常量指针)”。即它实际上相当于“char*const”,而不是“const char*(指向常量 char 的指针)”。当然,要想让 const PCHAR 相当于 const char* 也很容易,如下面的代码所示:

typedef const char* PCHAR;int strcmp(PCHAR, PCHAR);

其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。

还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;

不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。

相关推荐:《c语言教程》

以上就是C语言中typedef的用法有哪些?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1434368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 09:54:07
下一篇 2025年12月15日 18:12:39

相关推荐

  • 详细解说C语言中的两种输出对齐方式(小白必看)

    在编程调试时,通常将log信息输出到文件中,此时需要注意输出对齐方式  C语言中,常见的有两种方式可以实现其输出字符串或数字对齐输出 制表符t  制表符t输出的时候,会移动输出光标,实现对齐效果。 立即学习“C语言免费学习笔记(深入)”; 因此可以在输出的对应位置,增加t来实现对齐。 但有个缺点:要…

    2025年12月17日
    000
  • C语言中a++和++a有什么区别

    C语言中a++和++a的区别是:二者的运算过程不同,a++表示先使用a的值,然后再对a做加1处理;++a表示先对a做加1处理,然后再使用a的值。a++和++a都等价于【a = a+1】。 自增运算符: ++是自增运算符:如a++,++a都等价于a = a + 1; 那么a++和++a有什么区别呢? …

    2025年12月17日
    000
  • C语言中“||”是什么意思

    C语言中“||”表示逻辑操作符(或),它的操作数是布尔型,即只有“0”(表示false)和“1”(表示true)两个数值。C语言规定,在逻辑运算中,所有非0的数值都被看做1处理。 在 c 语言中,“||”表示逻辑操作符(或),它的操作数是布尔型,即只有“0”(表示 false)和“1”(表示 tru…

    2025年12月17日
    000
  • C语言中“ ”是什么意思

    C语言中“n”表示回车换行,将当前位置移到下一行的开头。与之类似的还有,“t”表示水平制表符,将当前位置移到下一个tab位置;“r”表示回车,将当前位置移到本行的开头。 c语言中,n 表示回车换行,将当前位置移到下一行的开头。 (推荐学习:C语言教程) 相关介绍: t r n都是转义字符,空格就是单…

    2025年12月17日
    000
  • c语言代码如何实现贪吃蛇动画

    c语言代码实现贪吃蛇动画的方法:首先确定基本思路,蛇每吃一个食物蛇身子就增加一格;然后用UP,DOWN,LEFT,RIGHT控制蛇头的运动,而蛇身子跟着蛇头走;最后每后一格蛇身子下一步走到上一格蛇身子的位置。 基本思路:  蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT…

    2025年12月17日
    000
  • 在c语言中代表什么?

    “”在c语言中代表“字符串结束符”。“”的ASCII码为“0”,也就是空字符;字符串总是以“”作为串的结束符;因此当把一个字符串存入一个数组时,也把结束符“”存入数组,并以此作为该字符串是否结束的标志。 <img src="https://cdn.chuangxiangniao.co…

    2025年12月17日
    000
  • 在c语言中char型数据在内存中的存储形式是什么?

    在c语言中char型数据在内存中的存储形式是ASCII码。在C语言中,char型数据是将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。 在c语言中char型数据在内存中的存储形式是ASCII码。 在C语言中,char型数据是将一…

    2025年12月17日
    000
  • printf(” “)是什么意思?

    “printf(“n”)”的意思是:换行。“printf(“n”)”表示输出换行符,“n”是个转义字符,系统识别到转义字符时会自动换行;窗口是不会显示“n”的,会直接换到下一行。 printf(“n”)的意思是:换行。 prin…

    2025年12月17日
    000
  • c语言真假是1和0吗?

    c语言真假是“1”和“0”。C语言中“0”为假,“1”为真,逻辑与和整数乘法相同;c语言中的“1”就是整数,整数除法“1/2”结果也会是整数,数学中答案是“0.5”,但是整型的不能保存“0.5”;因此会直接变成“0”。 C语言规定1为真(TRUE),0为假(FALSE)。 C语言中0为假,1为真,逻…

    2025年12月17日
    000
  • 你知道C语言的标识符命名规则是什么吗(详解)

    学习C语言的第一步,首当其冲的就是标识符,大家知道标识符的命名规则吗?下面我们一起看看吧。 C语言的标识符一般应遵循如下的命名规则:  1 标识符必须以字母a~z、 A~Z或下划线开头,后面可跟任意个(可为0)字符,这些字符可以是字母、下划线和数字,其他字符不允许出现在标识符中。  2 标识符区分大…

    2025年12月17日
    000
  • C语言中的每条可执行语句都将转换成什么

    C语言中的每条可执行语句都将转换成二进制的机器指令。C语言中的非执行语句不会被编译,不会生成二进制的机器指令。C语言不仅可以发挥出高级编程语言的功能,还具有汇编语言的特点。 c语言中的每条可执行语句最终都将转换成二进制的机器指令。 (推荐学习:C语言教程) 需要注意的是:C语言中的非执行语句不会被编…

    2025年12月17日
    000
  • switch语句中case后面的值必须是什么?

    switch语句中case后面的值必须是常量。因为switch语句中,会根据case标签后面的常量值,生成跳转表,只经过少数次数的比较,就可以跳到对应标签下面;如果允许变量,switch对于一个数据也只能从头到尾地进行比较,这就失去了意义。 switch语句中case后面的值必须是常量。 因为C语言…

    2025年12月17日
    000
  • struct student在c语言中是什么意思?

    “struct student”在c语言中就是被命名为“student”的一个结构体类型名。struct是C语言结构体类型的标识符;结构体支持把一组变量整合起来形成一个大的变量。 “struct student”就是被命名为student的一个结构体类型名。 struct是C语言结构体类型的标识符。…

    2025年12月17日
    000
  • “ ”在c语言中是什么意思?

    “nn”在c语言中表示连续两次换行。“n”是换行符,通常在输出中用作格式控制;“n”就是一个转义字符,其意义是“回车换行”;转义字符以反斜线“”开头,后面跟一个或几个字符。 nn在c语言中表示连续两次换行。 n的意思是:回车换行。将当前位置移到下一行的开头。 1、n是换行符,通常在输出中用作格式控制…

    2025年12月17日
    000
  • c语言关系运算符号有哪些?

    c语言关系运算符号有“=、==、!=”。关系运算符都是双目运算符,其的作用是判明这两个表达式的大小关系;关系运算符的优先级低于算术运算符,高于赋值运算符;其运算结果只有0或1,当条件成立时结果为1,条件不成立结果为0。 c语言关系运算符号有、>=、==、!=。 关系运算符的作用就是判明这两个表…

    2025年12月17日
    000
  • 带你了解C语言中的Sleep函数(附代码)

    Sleep函数: 功 能: 执行挂起一段时间   用 法: unsigned sleep(unsigned seconds);   注意:   立即学习“C语言免费学习笔记(深入)”; 在VC中使用带上头文件#include ,在Linux下,gcc编译器中,使用的头文件因gcc版本的不同而不同#i…

    2025年12月17日
    000
  • 三分钟了解C语言中自定义的标识符及规则

    C语言中的标识符有:关键字、预定义标识符、用户标识符 1.关键字:不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。 2.预定义标识符是C语言中系统预先定义的标识符,如系统类库名…

    2025年12月17日
    000
  • putchar函数在C语言中是什么意思

    putchar函数在C语言中表示字符串输出函数,putchar函数的功能是在终端(显示器)输出单个字符。函数语法格式:【int putchar(int ch)】,其中,ch表示要输出的字符内容。 putchar函数是c语言中的字符输出函数,其功能是在终端(显示器)输出单个字符。 (推荐教程:C语言教…

    2025年12月17日
    000
  • 在一个C语言程序中,main函数可以在任何地方出现么

    在一个c语言程序中,main函数可以在任何地方出现。一个完整的C语言程序有且仅有一个主函数(main()函数)。程序总是从main()函数的第一条语句开始执行,到main()函数的最后一条语句结束。 在一个c语言程序中,main函数可以在任何地方出现。 (推荐学习:C语言教程) 解析: 一个完整的C…

    2025年12月17日
    000
  • c语言中的标识符只能由三种字符组成,它们是什么?

    c语言中的标识符只能由三种字符组成,它们是下划线、字母、数字。C语言的标识符命名规则:1、标识符必须以字母a~z、A~Z或下划线开头,后面可跟任意个(可为0)字符;2、标识符区分大小写字母;3、标识符不能是关键字。 c语言中的标识符只能由三种字符组成,它们是下划线、字母、数字。 C语言的标识符一般应…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信