【C语言】typedef关键字

简介: typedef 的作用就是对类型进行重命名

一. 使用介绍

typedef 的作用就是对类型进行重命名,具体作用在以下几个方面:


对一般类型进行重命名

对结构体类型进行重命名(常用)

对指针进行重命名

对复杂结构进行重命名(比如数组)

1. 对一般类型进行重命名

// 对 unsigned int 类型重命名
typedef unsigned int u_int;
int main()
{
  u_int a = 10;
  unsigned int b = 20;
  a = b;
  return 0;
}

2. 对结构体类型进行重命名

typedef struct student 
{
  int age;
  char sex;
  char name[20];
}stu_t;
int main()
{
  stu_t a = {18, '男', "zhangsan"};
  return 0;
}

3. 对指针进行重命名

typedef int* int_p;
int main()
{
  int a = 10;
  int_p p1 = &a;
  return 0;
}


4. 对数组进行重命名

下面测试一下 typedef 有关数组的高级用法:


如果写了这句话:typedef int ARC[5];


那么,在使用main函数中直接使用ARC array;其作用就是定义一个叫做 array 的数组变量,这个变量内含有5个 int 类型的数据。


typedef int ARC[5];
int main()
{
  ARC array = { 1, 2, 3, 4, 5 };
  for (int i = 0; i < 5; ++i)
  {
  printf("%d ", array[i]);
  }
  return 0;
}
--------结果如下--------
1 2 3 4 5


二. typedef 和 #define 的区别

#define就是简单的文本替换,而typedef是正真重新定义了一种类型。

#define语句最后不用加分号,而typedef需要。

#define把替换后的文本写在中间位置,typedef把替换后的类型写在语句最后位置。

下面我们看三段代码来理解 typedef 和 #define 的区别:


例子一:下面代码分别用 typedef 和 #define 来给同一种指针类型重命名,然后用这两个重命名的指针类型去定义变量,看看各自的效果如何:


使用 #define 去替换 int*

f29f721f6f474f14910037d98bbc0921.png


使用 typedef 去重命名 int*

638580cb1f59487c9a33d903ff3610cf.png


例子二:下面关于 typedef 的代码对吗?


typedef int int64;
int main()
{
  unsigned int64 a;
  return 0;
}


不对,编译会报错。C 中 typedef 不支持这种数据类型的扩展,不能把 typedef 当成简单的宏替换;而宏替换是可以支持这种扩展的:


3b48aab5e49b412cbb90088f9c3468b5.png

例子三:typedef static int int32_t 行不行?


在这之前我们可以先试试typedef unsigned int int32_t这样行不行:


typedef unsigned int int32_t;
int main()
{
  int32_t a = 10;
  return 0;
}
--------结果如下--------
(编译通过)


那接下来试试typedef static int int32_t行不行:



d9429432e7034356ab7ca577fd19e88c.png

错误列表给了一个:指定了一个以上的存储类。这是什么意思呢?


原因是:存储类型关键字,不可以同时出现,也就是说,在一个变量定义的时候,只能有一个存储类型关键字。


C语言中,存储类型关键字包括以下5个:


auto:声明自动变量

extern:一般用来声明全局变量或函数

register:声明寄存器变量

static:声明静态变量或函数

typedef:用以给数据类型取别名(但是该关键字被分到存储关键字分类中,虽然看起来没什么相关性)

所以typedef static int int32_t这里报错的原因,是因为同时使用了 typedef 和 static 两个存储类型关键字,这C语言不允许的。


相关文章
|
1月前
|
编译器 C语言
C语言:typedef 和 define 有什么区别
在C语言中,`typedef`和`#define`都是用来创建标识符以简化复杂数据类型或常量的使用,但它们之间存在本质的区别。`typedef`用于定义新的数据类型别名,它保留了数据类型的特性但不分配内存。而`#define`是预处理器指令,用于定义宏替换,既可用于定义常量,也可用于简单的文本替换,但在编译前进行,过度使用可能导致代码可读性下降。正确选择使用`typedef`或`#define`可以提高代码质量和可维护性。
|
5月前
|
C语言
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
31 1
|
4月前
|
C语言
|
4月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
5月前
|
存储 C语言
C语言中的typedef关键字:为类型定义新名称
C语言中的typedef关键字:为类型定义新名称
|
5月前
|
C语言
深入探索C语言中的sizeof关键字
深入探索C语言中的sizeof关键字
|
5月前
|
存储 编译器 C语言
C语言中的关键字与标识符详解
C语言中的关键字与标识符详解
111 0
|
6月前
|
存储 C语言
【C语言】数据:数据类型关键字
【C语言】数据:数据类型关键字
|
6月前
|
存储 编译器 C语言
c语言中static关键字的作用
c语言中static关键字的作用
|
6月前
|
编译器 C语言 C++
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr(下)
从C语言到C++③(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for+nullptr
47 0