typedef的使用

目录

1.定义

2.使用场景

2.1 情况1

2.2 情况2

2.3 在结构体中的应用


1.定义

C 语言中使用结构体时必须加上 struct 这个关键字 , 那有没有办法省略这个呢 ? 要想达到这个目的就
需要用到关键字 typedef, 顾名思义 类型定义
结构:typedef 数据类型 新的别名 ;

2.使用场景

(1) 给一个较长较复杂的类型取一个简单的别名。
(2) 给类型取一个和问题相关的别名。
这两种情况在生活中都非常常见 , 例如第 1 种情况 , 中华人民共和国简称中国 , 2 种情况 , 你的同学非常
的漂亮给她起个外号叫 大美丽

2.1 情况1

第一种情况的使用如下 :
typedef unsigned long long int uint64;//给无符号长长整型取别名叫uint64

int main()
{
unsigned long long int a = 1000;//定义一个无符号长长整型变量
uint64 b = 2000; //定义一个无符号长长整型变量
uint64* p = &b;
p = &a; //a和b的类型完全相同
return 0;
}
上面的代码给 unsigned long long int 数据类型取了一个简单的别名 uint64, 其中 u 表示符号 ,int 表示
整数 ,64 表示 64 位。
typedef unsigned long long int uint64;//给无符号长长整型取别名叫uint64
typedef int* Pint;//给整型指针int * 取别名叫Pint
typedef int Arr[10];//这是什么呢?
typedef int (*Pfun)(int, int);//这是什么呢?

int main()
{
  int a = 10;
  Pint p = &a;
  printf("%d\n", sizeof(Arr));
  return 0;
}
2 行代码给 int* 类型取了一个别名 Pint, 在第 9 Pint 定义的变量就是 int* 这种数据类型了。
对于比较复杂的类型如 3,4 行就不容易理解了。那怎么办呢 ? 关键是牢记 typedef 是用来定义数据类型
的。
对于复杂的类型可以先把 typedef 去掉 , 看看是定义一个什么类型的变量 , 然后加上 typedef 它就由这种
类型的变量提升为这种数据类型。

 利用typedef定义的新类型使用如下:

typedef int* Pint;//给整型指针int * 取别名叫Pint
typedef int Arr[10];//Arr为整数数组类型
typedef int (*Pfun)(int, int);//Pfun为函数指针类型

int Max(int a, int b)
{
   return a > b ? a : b;
}

int main()
{
  int a = 10;
  Pint p = &a; //p为指针变量
  Arr arr = { 1,2,3,4,5,6,7,8,9,10 };//arr为数组
  Pfun pf = Max;//pf为函数指针变量
  printf("%d\n", pf(10, 20));
  return 0;
}
13 ,Pint 为整型指针类型 , 那么它定义的变量就是整型指针变量。
15 ,Arr 为整型数组类型 , 那么它定义的变量就是整型数组变量。
17 ,Pfun 为函数指针类型 , 那么它定义的变量就是函数指针变量。

2.2 情况2

typedef 的第二种情况 : 给类型取一个和问题相关的别名。这种方式最典型的应用是 size_t time_t 这两种类型。size_t 应用在计数方面 ,time_t 应用在时间方面。在 visual studio2022 中这两者的定义如下 :

2.3 在结构体中的应用

回到本节提到的问题 , 如何在使用结构体时省略 struct 这个关键字呢 ? 可以按照如下方法定义结构体。
例如 :
//第一个方式
struct A
{
  int a;
  char b;
};
typedef struct A A;//给struct A起个别名叫A

//第二种方式
typedef struct B
{
  char a;
  int b;
}B; //给struct B起个别名叫B

int main()
{
  A aa = { 10,'x' }; //直接使用A
  B bb = { 'y',20 }; //直接使用B
  return 0;
}
typedef struct Node {
	int data;
	struct Node* next;
}Node,*List;//List==Node*

//typedef struct Node* List;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值