C语言typedef的用法

时间:2024-10-21 13:58:11

参考链接

一、概念

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称。
示例:

typedef int BOOL;//定义一个布尔类型
#define TRUE 1
#define FALSE 0

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

二、typedef的4种用法

  1. 为基本数据类型定义新的类型名
    比如跨平台时,有的机子不支持long double,但有需要高精度的一个类型参与计算,那就可以进行如下定义:
typedef long double ACCURACY;//当跨平台时,只需修改long double的类型就可以了,如下
typedef double ACCURACY;
  1. 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
以结构体为例,下面我们定义一个名为 Point 的结构体:
struct Point
{
    double x;
    double y;
    double z;
};

在调用这个结构体时,我们必须像下面的代码这样来调用这个结构体:
struct Point oPoint1={1001000};
struct Point oPoint2;

上面是传统定义方法,下面是利用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

综上:现在就可以像 intdouble 那样直接使用 Point 定义变量,如下面的代码所示:
Point oPoint1={1001000};
Point oPoint2;


如果上面结构体的声明没看懂可以先看下这个:

#include <>
  
typedef int A,*B;//定义两个类型,一个整型的别名A,一个整型指针B,这两个变量没有联系,谁也代表不了谁,都是独立的。

int main()
{
    A aa=10;
    B bb;
    *bb=12;
    printf("&aa=%p\n",&aa);
    printf("bb=%p\n",bb);
    printf("aa=%d\n",aa);
    printf("*bb=%d\n",*bb);
    return 0;
}
#include <>
#include <>

#define MAXSIZE 100       // 顺序表的最大长度

typedef int ElemType;     // 自定义顺序表的数据元素为整数。

typedef struct
{
  ElemType data[MAXSIZE];   // 用数组存储顺序表中的元素
  unsigned int length;      // 顺序表中元素的个数
}SeqList,*PSeqList;//这个就是定义两个类型,一个是结构体别名SeqList和一个结构体指针PSeqList。
  1. 为数组定义简洁的类型名称
与为基本数据类型定义新的别名方法一样,示例代码如下所示:

typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;
  1. 为指针定义简洁的名称
对于指针,我们同样可以使用下面的方式来定义一个新的别名:
typedef char* PCHAR;
PCHAR pa;

例如有下面这种类型,上面这个方法就有大用处了:
int *(*a[5])(int,char*);

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