一、typedef VS #define
在开始说明typedef关键字之前,我想先试着区分一下typedef和define宏定义。例如:
/*#define 形式*/
#define COUNT int
/*typedef形式 */
typedef int COUNT;
typedef与**#define**有相似之处,上述两条语句的作用都是用COUNT代替int。但是事实上,他们二者是不同的。#define 是在预编译时处理的,它只能做简单的字符串替换,二typedef是在编译时处理的,实际上,它并不是作简单的字符串替换,而是采用如同定义变量的方法那样来声名一个类型。
- 案例1:
/*使用typedef方式*/
typedef int COUNT,*PCOUNT;
int main()
{
COUNT a = 520;
PCOUNT b,c;
b = &a;
c = b;
printf("address of a = %p\n",&a);
printf("address of a = %p\n",b);
printf("address of a = %p\n",c);
}
- 案例2:
/*使用#define方式*/
#include <stdio.h>
#include <stdlib.h>
#define COUNT int
#define PCOUNT int*
int main()
{
COUNT a = 520;
PCOUNT b,c;
b = &a;
c = b;
printf("address of a = %p\n",&a);
return 0;
}
案例2虽然也能编译成功,但是会出现这样一个警告,大意就是b是指针变量,而c是一个int变量,两种不同类型的变量理论上是不能赋值的!
- 但为什么会出现警告呢?
- 因为#define只是单纯地进行文本替换,所以PCOUNT<=>int*,PCOUNT b,c<=>int b,c*;是不是似曾相识,这不就是我们定义一个指针变量,一个int变量的写法吗!
二、基础typedef
废话不说,直接案例说明!
typedef为变量起别名
- 案例3:
typedef int COUNT,*PCOUNT;
int main()
{
COUNT a = 520;
PCOUNT b,c;
b = &a;
c = b;
printf("address of a = %p\n",&a);
printf("address of a = %p\n",b);
printf("address of a = %p\n",c);
}
typedef为结构体起别名
- 案例4:
#include <stdio.h>
#include <stdlib.h>
typedef struct Date
{
int year;
int month;
int day;
}DATE,*PDATE;
int main()
{
PDATE time; // PDATE time<=>DATE* time<=>struct Date* time
time = (PDATE)malloc(sizeof(DATE));
printf("请输入年份:");
scanf("%d",&time->year);
printf("请输入月:");
scanf("%d",&time->month);
printf("请输入日:");
scanf("%d",&time->day);
printf("%d-%d-%d",time->year,time->month,time->day);
return 0;
}