C语言中的typedef

typedef 的讲解与应用实例

  •   前言:我们学过C语言的人都应该听过,或者说学过,甚至说用过typedef,多多少少都对其有所了解。不过就算没听过也没关系,我们一起来探讨一下。
  •   阐述:typedef 是英文 Type Define 的缩写,中文就是类型定义。在计算机编程语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
  • typedef与define的差异:#define在预编译中,只是做简单的完全替换不会做错误检查,不管三七二十一,只会完全替换,例如:#define PI 3.1415926535 你写成3.L415926535,傻傻的编译器还是会把它代入引用的位置。而typedef unsigned int u16;
/*用法一:类型的重定义*/
typedef unsigned char u8;
typedef char * PCHAR;
......

这里的第一句是给unsigned char类型重新起个别名,叫 u8  应用时看到u8 定义的变量,就相当于unsigned char 类型,两者是完全等价的。同理第二句是给char *

起了个别名PCHAR ,即 PCHAR 类型代表着指向字符串类型的指针。

1 /*用法二:与结构体结合使用*/
2 typedef struct tagMyStruct
3 {
4     int iNum;
5
6     long lLength;
7
8 }MyStruct;

这个代码实际上相当于进行了两个操作:

第一声明了一个结构体名为   tagMyStruct

tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和 tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一

个结构类型。

1 struct tagMyStruct
2 {
3
4     int iNum;
5
6     long lLength;
7
8 };

第二给该结构体起了个别名叫 MyStruct

1 typedef struct tagMyStruct MyStruct;

因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。

当然,我们有时还会看到如下定义:

typedef struct student
{
    char name[N];
    int age;
    char * sex;
}std,*pt;

这时是不是感觉有点奇怪,究竟std是结构体的别名,还是*pt是结构体的别名呢?这就是我今天要讲的重点。

上面的代码相当于执行了三步操作:

第一步:定义结构体

 struct student
{
    char name[N];
    int age;
    char * sex;
}std;

第二步:给结构体重命名

typedef struct student std;

第三步:给结构体指针类型重命名

typedef student struct * pt;

这时,我们可以用pt来声明结构体指针类型的变量了,不用再写 struct student * kk;  直接写  pt kk;  简单明了。

下面给个简单的实例:

 1 /*
 2 *                程序名称:typedef 的简单实例
 3 *
 4 *                                    Veis声明。
 5 */
 6 #include <stdio.h>
 7 #include <string.h>
 8 #define N 20
 9 typedef struct student
10 {
11     char name[N];
12     int age;
13     char * sex;
14 }std,*pt;                /*这里的 pt 相当于一个 struct student * 类型;而 std 则是给结构体student起的别名*/
15 void main()
16 {
17     /*变量声明*/
18     pt p;                    /*语句    struct student * p;   与语句  pt p;  等价*/
19     std st1;
20
21     /*变量初始化*/
22     strcpy(st1.name,"alen");
23     st1.age = 15;
24     st1.sex = "male";
25     p = &st1;
26
27     /*打印输出*/
28     printf("\t\t\tStudent‘s  Informations\nname:%s\nage:%d\nsex:%s\n\n",p->name,p->age,p->sex);
29 }

PS:心动不如行动,看完自己尝试去写,只有去写去思考,你才能更好的理解和掌握一种东西。

本文作者能力有限,若本文有什么讲错的地方欢迎指出,共同进步。-----------------Veis

时间: 2024-10-17 00:35:17

C语言中的typedef的相关文章

关于C语言中的typedef

在C语言中定义一个结构体,要最好使用typedef,使用typedef,实际上就是为我们的结构体起了一个新的名字,即定义了一个新的类型,在后面书写自己代码的时候,就可以直接使用自己定义的新的类型第一变量. 例如 #include<stdio.h> typedef struct { int num; struct Node *next; }Node; int main() { Node n; n.num=111; printf("%d",n.num); return 0; }

C语言中的typedef跟define的区别

今天用C语言练习时涉及到了typedef和define的使用问题,那么他们的区别是啥?这种情况下为什么要用typedef?哪种情况下为什么要用define呢? 学习C的时候的你是否考虑过这个问题呢? 今天我决定梳理一下,以备后用. 相同点: 1.都可以给变量起别名 不同点: 1.define定义后可以扩展,而typedef则不可以. 1 //定义完一个整型的数据后补充定义为无符号的 2 3 #define zhengxing int 4 unsigned zhengxing;//正确 5 6 t

c语言中struct的初始化

C++中的struct已经和class一样,可以用构造函数初始化. C语言中的struct怎么初始化呢? typedef struct _TEST_T {        int i;        char c[10];}TEST_T; TEST_T gst  = {1, “12345”};//可以初始化,设置i为1,s为一个字符串. TEST_T gst  = {1};//初始化个数少于实际个数时,只初始化前面的成员. TEST_Tgst  = {.c=“12345”};//有选择的初始化成员

C语言中,结构体成员变量的点和箭头

C语言中,调用成员变量用点还是用箭头,取决于当前的ID是指针还是结构体本身. 如: typedef struct { float height; float weight; } Person; int main(int argc, char *argv[]) { Person jiushen; Person *lengleng = (Person *)malloc(sizeof(Person)); //注意这里结构体指针的声明,要分配空间 jiushen.weight = 60; jiushen

C语言中sizeof与strlen区别

C语言中sizeof 与strlen 区别 一.本质区别 sizeof 和strlen 有本质上的区别.sizeof 是C 语言的一种单目运算符,如++.--等,并不是函数,sizeof 的优先级为2 级,比/.% 等3 级运算符优先级高,sizeof 以字节的形式给出操作数的存储空间的大小.而 strlen 是一个函数,是由 C 语言 的标准库提供的.strlen 计算的  是字符串的长度. 二.使用区别 1.sizeof sizeof 的操作数可以是数据类型.函数.变量,表达式使用方式为:

转]解析C语言中的sizeof

解析C语言中的sizeof 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出 了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. 二.sizeof的使用方法 1.用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住.如sizeof(int). 2.用于变量 sizeof使用形式:sizeof(var_name)或size

C语言中,隐藏结构体的细节

我们都知道,在C语言中,结构体中的字段都是可以访问的.或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public.结构体的这一个特性,导致结构体中封装的数据,实际上并没有封装,外界都可以访问结构体重的字段. C++中我们尚可用类来替代结构体,但是,C语言中是没有类的,只能用结构体,但很多时候,我们需要隐藏结构体的字段,不让外界直接访问,而是通过我们写的函数进行间接访问,这样就提高了程序的封装性. 实现方法,简单来说,就是,结构体定义时,要定义在.

C语言中的32个关键字

C语言中的32个关键字 数据类型关键字(12个) (1)     char:声明字符型变量或函数 (2)     double:声明双精度变量或函数 (3)     enum:声明美剧类型 (4)     float:声明浮点型变量或函数 (5)     int:声明整型变量或函数 (6)     long:声明长整型变量或函数 (7)     short:声明短整型变量或函数 (8)     signed:声明有符号类型变量或函数 (9)     struct:声明结构体变量或函数 (10) 

在Swift语言中,关于Any,AnyObject,AnyClass的区别与联系

在Swift语言中,协议定义类或结构体应该遵守的变量和方法集合,如下所示,这个一个标准的协议的声明: protocol NSObjectProtocol { func isEqual(object: AnyObject?) -> Bool var hash: Int { get } var superclass: AnyClass? { get } func `self`() -> Self! func isProxy() -> Bool func isKindOfClass(aClas