一、C语言允许对已有的数据类型定义另外的类型名,目的是为了增强程序的可读性。重命名数据类型的命令是typedef,他一C语言形式出现在程序中。
typedef的一般形式如下:
typedef 已有类型名 新类型名;
例如:
typedef int intWith;
typedef float floatWith;
二、示例讲解
1. Typedef作用简介
#include
#include
// 与宏变量区别
typedef int Integer;
typedef unsigned int UInterger;
typedef float Float;
// 可以在别名的基础上在定义一个别名
typedef Integer MyInteger; // 最终源头是int 类型
int main (int argc, const char * argv[]) {
// 平时定义一个变量
int a = 100;
// typedef float Float; 不过这样子的话只能在函数内部使用
// 使用typedef定义,
Integer b = 100; // 等价于int b = 100;
UInterger c = 100;
Float d = 21;
MyInteger e = 100;
// 输出
printf("%d %d %.2f %d\n", b, c, d, e);
system("pause");
return 0;
}
2. typedef与指针
typedef不仅能给基本数据类型定义别名,也可以给指针定义别名
// 与指针去别名
void testp() {
typedef char *String;
// 相当于 char *str = "this is a string";
String str = "this is a string";
printf("%s", str);
}
3. typedef与结构体
结构体中使用指针会更加简洁
3.1 平时使用结构体变量
// 给结构体取别名
// 普通情况下
// 定义一个结构体
struct MyStruct01
{
float a;
float b;
};
// 调用
void testOfStruct() {
// 定义结构体变量
struct MyStruct01 p; //每次定义结构体变量都是需要 struct 这个关键字
p.a = 12.0f;
p.b = 22.0f;
printf("%f %f\n", p.a, p.b);
}
3.2 使用typedef结构体给命名
// 使用typedef结构体给命名
struct MyStruct02
{
float a;
float b;
} xi;
// 取别名
typedef struct MyStruct02 pp; // 可以合成一句:定义一个结构体,顺便起别名;或者是省略结构体名称
typedef xi ppp; // 更加简洁
// 调用
void testOfStruct() {
// 定义结构体变量
MyStruct02 pp;
pp.a = 12.0f;
pp.b = 22.0f;
printf("%f %f\n", pp.a, pp.b);
}
4. typedef与指向
结构体的
指针
// typedef与指向结构体的指针
// 定义一个结构体并取别名
typedef struct {
float a;
float b;
} MyStruct03;
//取别名
typedef MyStruct03 *pp;
// 调用
void testOfStruct03() {
// 定义结构体变量
MyStruct03 ppp = {10, 20};
// 定义
pp p = &ppp;
// 利用指针变量访问结构体成员
printf("x = %f, y = %f", p->a, p->b);
}
5. typedef与枚举类型
// 枚举
// 定义枚举类型
enum Season { // 注意这里使用的是逗号, 而结构体使用的是分号;
Spring,
summer,
winter
};
// 给枚举类型起别名
typedef enum Season Sea;
// 调用
void testOfEnum() {
// 定义枚举变量
Sea s = Spring; // 这里就不在用带上关键字enum了
}
6. typedef与指向函数的指针
首先来区分下指针函数与指向函数的指针的区别
1. 指针函数: 函数返回值是指针类型的函数称作指针函数。一般格式:
数据类型 * 函数名 (形参表)
{
函数体
}
注意:对于指针函数,用return返回的值一定是指针值。
2. 指向函数的指针变量:存放函数的入口地址的变量就是一个指向函数的指针变量,简称函数的指针。
函数的指针的定义形式是:
数据类型 (* 指针变量名)()
数据类型为函数返回值的类型。如:int (*p) (); 语句的功能是定义一个指向函数的指针,该函数的返回值为整型数据。
和变量的指针一样,函数的指针也必须赋值后才能指向具体的函数。由于指针名代表了该函数的入口地址,因此,通常直接用函数名为函数指针赋值。
函数指针名 = 函数名。例如:
double fun (); // 函数说明
double (*f) (); // 函数指针说明
f = fun; // f指向fun函数
6.1 函数指针例子
// 函数指针
// 定义一个sum函数,计算a跟b的和
int sum(int a, int b) {
int c = a + b;
printf("%d +%d = %d\n", a, b, c);
return c;
}
// 调用
void testOfP() {
// 定义一个指向sum函数的指针变量p
int (*p)(int , int) = sum;
// 利用指针变量p调用sum函数
(*p)(4, 5);
}
6.2 为了简化代码我们使用typedef来给指向函数的指针类型起别名
// typedef来给函数指针起别名
int sum1(int a, int b) {
int c = a + b;
printf("%d +%d = %d\n", a, b, c);
return c;
}
typedef int(*Mysum)(int, int);
// 调用
void testOfP1() {
// 定义一个指向sum函数的指针变量p
Mysum p = sum1;
// 利用指针变量p调用sum函数
(*p)(4, 5);
}
7. typedef与#define
注意宏定义纯粹是字符串的替换
例子1:
// #define与typedef的区别
typedef char *str; // 用typedef给char *定义别名为String
#define st char *; // 用char *代替代码中的宏名String
void testOfDef() {
str s = "thit is a string";
printf("%s\n", s);
st ss = "thit is a string";
printf("%s\n", ss);
}
// 不过上面两个输出的结果是一样的 this is a string
例子2:
typedef char *String1;
#define String2 char *
void testOfDef1() {
String1 str1, str2;
// str1, str2 都是指向char类型的指针变量
// 由于经过typedef处理后,String1也算是一种数据类型,所以String1 str1, str2;相当于
// String1 str1;
// String1 str2;
// 由于String1就是char *,所以上面的两行代码等于
// char *str1;
// char *str2;
String2 str3, str4;
// char3 是指向char类型的指针变量, str4只是个char类型的变量
// 因为宏定义纯粹是字符串替换,用char *代替String2,所以String2 str3, str4相当于
// char *str3, str4;
// 也就是 char *str3;
// char str4;
// 综上所述给类型取别名,多的话最好使用typedef,而不是使用#define
}