17. typedef关键字的使用
一、为什么需要typedef关键字
C 语言允许用户使用 typedef 来为一个数据类型起一个新的别名。一旦用户在程序中定义了别名,就可以在该程序中使用别名来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。
typedef 关键字定义的名称并不是真的创造了一种数据类型,而是给已有的或者复合型的以及复杂的数据类型取一个我们更容易理解识别的别名。
二、typedef关键字的使用
使用关键字 typedef 可以为类型起一个新的别名。typedef 的用法一般为:
typedef oldName newName;
其中,oldName 是类型原来的名字,newName 是类型新的名字。
2.1、基本数据类型起别名
#include <stdio.h>
typedef unsigned char uint8_t; //无符号8位整数
int main(void)
{
uint8_t ch = 'a';
printf("%c\n",ch);
return 0;
}
当我们使用 uint8_t 时,就和使用 unsigned char 是一样的。
2.2、数组类型起别名
#include <stdio.h>
typedef int numbeArray10[10];
int main(void)
{
int i = 0;
numbeArray10 array = {0,1,2,3};
for(i = 0; i < 10; i++)
{
printf("%d\n",array[i]);
}
return 0;
}
其中 numberArray10 表示定义一个长度为 10 的整数数组。numberArray10 array 等价于 int array[10]。
2.3、指针数据类型起别名
#include <stdio.h>
typedef char* pointer;
int main(void)
{
pointer p = "hello";
printf("%s\n",p);
return 0;
}
我们定义了一个指针类型,当我们使用 pointer p 声明一个指针变量,就和使用 char *p 的含义是一样的。
2.4、结构体类型起别名
#include <stdio.h>
struct Person
{
char name[20];
int age;
};
typedef struct Person person;
int main(void)
{
person p = {"Sakura",10};
printf("name: %s, age = %d\n",p.name,p.age);
return 0;
}
我们还可以在定义结构体时顺便使用 typedef 关键字定义结构体别名。
#include <stdio.h>
typedef struct Person
{
char name[20];
int age;
}person;
int main(void)
{
person p = {"Sakura",10};
printf("name: %s, age = %d\n",p.name,p.age);
return 0;
}
用 typedef 给结构体起别名的时候,可以省略结构体的类型名。
#include <stdio.h>
typedef struct
{
char *name;
int age;
}Person;
int main(void)
{
Person p = {"Sakura",10};
printf("name: %s, age = %d\n",p.name,p.age);
return 0;
}
2.5、枚举类型起别名
#include <stdio.h>
enum WEEK
{
MONDAY = 1,
THESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
typedef enum WEEK Week;
int main(void)
{
Week week = WEDNESDAY;
printf("%d\n",week);
return 0;
}
我们还可以在定义枚举类型时顺便使用 typedef 关键字定义枚举类型别名。
#include <stdio.h>
typedef enum WEEK
{
MONDAY = 1,
THESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}Week;
int main(void)
{
Week week = WEDNESDAY;
printf("%d\n",week);
return 0;
}
用 typedef 给枚举类型起别名的时候,可以省略枚举的类型名。
#include <stdio.h>
typedef enum
{
MONDAY = 1,
THESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}Week;
int main(void)
{
Week week = WEDNESDAY;
printf("%d\n",week);
return 0;
}
2.6、函数指针起别名
#include <stdio.h>
int max(int a, int b);
int main(void)
{
int num1 = 0,num2 = 0;
int maxNum = 0;
/**
* 定义函数指针
* func 是函数指针的别名
* int 表示该函数指针指向的函数是返回int类型的
* (int,int)表示该函数指针指向的函数形参是接收两个int
* 在定义函数指针时,也可以写上形参名typedef int (*func)(int a,int b);
* 对于函数来说,&函数名和函数名都是函数的地址
*/
typedef int (*func)(int,int);
func pmax = &max;
printf("请输入两个数,中间以空格分隔:\n");
scanf("%d%d",&num1,&num2);
/**
* (*pmax)(num1,num2)通过函数指针去调用函数
* 也可以这样调用pmax(num1,num2);
*/
maxNum = (*pmax)(num1,num2);
printf("the max num is : %d\n",maxNum);
return 0;
}
int max(int a, int b)
{
return a>b ? a : b;
}