码迷,mamicode.com
首页 > 编程语言 > 详细

C语言(八)typedef关键字

时间:2015-02-07 13:16:29      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:c   typedef   

一、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只是纯粹为原本的数据类型取一个别名而已,就相当于人的外号,多了一个更加方便的称呼而已。






























C语言(八)typedef关键字

标签:c   typedef   

原文地址:http://blog.csdn.net/z18789231876/article/details/43602177

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!