文章目录
typedef最初的用途就是希望C语言能用与其他语言相同的关键字定义变量
#include<stdio.h>
typedef int integer;//后面要加封号
int main(void)
{
integer a;
int b;
a=520;
b=a;
printf("%d",b);
return 0;
}
考虑能否用define 宏定义来实现
#define integer int
//不用加封号
实际上也是可以实现的
但是俩者本质不一样
反例:
#include<stdio.h>
//typedef int integer;//后面要加封号
#define integer int;
int main(void)
{
unsigned integer a;
a=-1;
printf("a=%u\n",a);
return 0;
}
打印结果并不是-1
a=4294967295
因为-1已经被转换成了一个无符号整型
原因进制转化
尝试使用typedef
#include<stdio.h>
typedef int integer;//后面要加封号
//#define integer int;
int main(void)
{
unsigned integer a;
a=-1;
printf("a=%u\n",a);
return 0;
}
发现会报错!
反例2,定义指针变量的情况:
#include<stdio.h>
typedef int integer;//后面要加封号
typedef int *PTRINT;
//#define integer int;
//#define PTRINT int*
int main(void)
{
INTEGER a=520;
PTRINT b,c;
b=&a;
c=b;
printf("addr of a=%p\n:",c);
return 0;
}
typedef 可以正常运行,但是#define会报错
因为#define是直接替换
所以 PTRINT b,c;
其实就变成int *b,c;
这里就是只定义了b
而反过来 用typedef 的情况 b,c都会变成指针。
比起宏定义的直接替换,typedef是对类型的封装,对原有的数据类型起一个别名
其中还可以对一个数据类型起多个别名,如上所示。
typedef在结构体的应用
#include<stdio.h>
#include<stdlib.h>
struct Date
{
int year;
int month;
int day;
};
int main()
{
struct Date *date;
date=(struct Date*)malloc(sizeof(struct Date));
if (date==NULL)
{
exit(1);
}
date->year=2017;
date->month=5;
date->day=15;
printf("%d-%d-%d\n",date->year,date->month,date->day);
}
到处都要写struct ,十分多余,但是又不能不写,所以可以用typedef 来对整个结构体取个别名
#include<stdio.h>
#include<stdlib.h>
typedef struct Date
{
int year;
int month;
int day;
} DATE;//把struct Date 都用DATE来替代
int main()
{
DATE *date;
date=(DATE*)malloc(sizeof(DATE));
if (date==NULL)
{
exit(1);
}
date->year=2017;
date->month=5;
date->day=15;
printf("%d-%d-%d\n",date->year,date->month,date->day);
}
更进一步,国际上通用做法,再对结构起别名后面还应该再多一个结构体指针的别名
typedef struct Date
{
int year;
int month;
int day;
} DATE,*PDATE;//把struct Date 都用DATE来替代
DATE *就可以用PDATE来替代
进阶typedef
typedef 使用的目的
1.一个是给变量起一个容易记住且意义明确的别名;
2.简化一些比较复杂的类型声明,主要还是用于声明!!
一些比较恐怖的声明语句:
int(*ptr)[3];//是一个数组指针,指针指向一个拥有三个整型元素的数组
别名
typedef int (*PTR_TO_ARRAY)[3]
#include<stdio.h>
typedef int(*PTR_TO_ARRAY)[3];
int main()
{
int array[3]={1,2,3};
PTR_TO_ARRAY ptr_to_array=&array;
for(int i=0;i<3;i++)
{
printf("%d\n",(*ptr_to_array)[i]);
}
return 0;
}
2.int(*fun)(void)//函数指针
,后面跟着的是小括号就是函数
typedef int(*PTR_TO_FUN)(void);
#include<stdio.h>
typedef int(*PTR_TO_FUN)(void);
int fun(void)
{
return 520;
}
int main()
{
PTR_TO_FUN ptr_to_fun=&fun;
printf("%d\n",(*ptr_to_fun)());
return 0;
}
int *(*array[3])(int);
(array[3])就是一个指针数组,intA(int);
用typedef 简化
typedef int *(*PTR_TO_FUN)(int);
PTR_TO_FUN array[3];
//存放指针,指向三个函数的地址
#include<stdio.h>
typedef int*(*PTR_TO_FUN)(int);
int *fun1(int num)
{
return #
}
int *fun2(int num)
{
return #
}
int *fun3(int num)
{
return #
}
int main()
{
PTR_TO_FUN array[3]={&fun1,&fun2,&fun3};
for(int i=0;i<3;i++)
{
printf("add of num:%p\n",(*array[i])(i));
}
return 0;
}
void (*funA(int,void(*funB)(int)))(int);
funA是一个函数
void (*funA(参数))(int);
第二个参数是一个函数指针
返回的是一个函数指针和第二个参数一样。
因此,把其和第二个参数一样进行化简
typedef void(*PTR_TO_FUN)(int);
PTR_TO_FUN funA(int,PTR_TO_FUN);
要进行还原就是把funA(int,PTR_TO_FUN)
整个式子替换到typedef void(*PTR_TO_FUN)(void);
中去