一、typedef作用简介
我们可以使用typedef关键字为各种数据类型定义一个新名字(别名)。
#include <stdio.h>
typedef int Integer;
//为int数据类型定义一个别名typedef unsigned int UInterger;
typedef float Float;
int main(){
Integer i=-10;
UInterger ui =11;
Float f=12.39f;
printf("%d %d %.2f",i,ui,f);
return 0;
}
为数据类型起了别名后,原来的名字还是可以用的。
也可以在别名的基础上再起一个别名。
#include <stdio.h>
typedef int Integer;
typedef Integer MyInteger;
int main(){
MyInteger i=-10;
printf("%d ",i);
return 0;
}
二、typedef与指针
#include <stdio.h>
typedef char* MyString;
int main(int argc,const char * argv[]){
MyString str="this is a string";
printf("%s",str);
return 0;
}
三、typedef与结构体
给结构体起别名可以使代码更加简明
1.默认情况下结构体变量的使用
// 定义一个结构体
struct MyPoint {
float x;
float y;
};
int main(int argc, const char * argv[]) {
// 定义结构体变量
struct MyPoint p;
p.x = 10.0f;
p.y = 20.0f;
return 0;
}
2.给结构体定义别名
// 定义一个结构体
struct MyPoint {
float x;
float y;
};
// 起别名
typedef struct MyPoint Point;
int main(int argc, const char * argv[]) {
// 定义结构体变量
Point p;
p.x = 10.0f;
p.y = 20.0f;
return 0;
}
在第8行,给结构体MyPoint起了别名,在12行用Point定义了一个结构体变量,不用再带上struct关键字了。
其实可以简写:
// 定义一个结构体,顺便起别名
typedef struct MyPoint {
float x;
float y;
} Point;
甚至可以省略结构体名称
typedef struct {
float x;
float y;
} Point;
四、typedef与指向结构体的指针
#include <stdio.h>
//定义一个结构体,并给结构体起别名
typedef struct{
float x;
float y;
} Point;
//定义一个指向结构体类型(别名的方式)的指针,并为指针取别名
typedef Point *pp;
int main(){
//定义结构体变量--用别名
Point point ={10,20};
//定义指针变量
pp p=&point;
//用指针变量访问结构体成员
printf("x=%f,y=%f\n",p->x,p->y);
return 0;
}
在上面的例子中,以省略结构体名称的方式定义了一个结构体,同时为结构体起了别名。
定义一个指向结构体类型的指针,这里的结构体类型用别别名的方式,并同时为指针取了别名。
五、typedef与枚举类型
//定义了一个枚举类型
enum Season {spring,summer,autumn,winter};
//给枚举变量取别名
typedef enum Season Sea;
int main(){
//定义枚举变量,起了别名之后,都不用带上enum关键字了。
Sea s=spring;
return 0;
}
也可以i在定义枚举类型的同时起别名
typedef enum Season{spring,summer,autumn,winter} Sea;
或
typedef enum {spring,summer,autumn,winter} Sea
六、typedef与指向函数的指针
不是用别名
#include <stdio.h>
int sum(int a,int b){
int c=a+b;
printf("%d + %d=%d\n",a,b,c);
return c;
}
int main(){
//定义一个指向函数的指针
int (*p)(int ,int)=sum;
int result=(*p)(4,5);
printf("%d\n",result);
return 0;
}
使用别名
#include <stdio.h>
int sum(int a,int b){
int c=a+b;
printf("%d + %d=%d\n",a,b,c);
return c;
}
//声明一个指针并取别名
typedef int (*MySum)(int,int);
int main(){
//定义一个指向函数sum的指针变量
MySum p=sum;
int result=(*p)(4,5);
printf("%d\n",result);
return 0;
}
七、typedef与#define
1.比较2段代码
代码1:
typedef char *String;
int main(int argc, const char * argv[]) {
String str = "This is a string!";
return 0;
}
代码2:
#define String char *
int main(int argc, const char * argv[]) {
String str = "This is a string!";
return 0;
}
上面的2段代码只是第一行代码不一样,运行的效果都是一样的。但是实现的方式是不一样的:
代码1:用的是typedef给char *定义别名String
代码2:用的是char *代替代码中的宏名String
2.看代码
typedef char *String1;
#define String2 char *
int main(int argc, const char * argv[]) {
String1 str1, str2;
String2 str3, str4;
return 0;
}
上面的代码中,只有str1,str2,str3才是指向char的类型的指针变量,str4只是一个char类型的变量。
原因分析:
经过typedef处理后,String1也相当于一种数据类型,所以String1 str1,str2;相当于String1 str1;String1 str2。
#define String2 char *;
String2 str3,str4;
因为宏定义是纯粹的字符串替换,用char 8替换String2,也就相当于char *str3,str4,也就相当于char *str3,char str4;
所以,给类型起别名的时,最好使用typedef。
总结:
typedef只是纯粹为原本的数据类型取一个别名而已,就相当于人的外号,多了一个更加方便的称呼而已。