在C语言中typedef和#define有着许多的相似之处也有着不同之处那么他们各自是怎么使用的,又有怎样的不同呢?Let’s go.
typedef与#define的战斗
一、typedef
typedef用来为复杂的声明定义简单的别名,可以定义在主函数里面也可以定义在主函数外面。为什么会有ta呢?举个例子,如果一个程序中要在多个函数中分别定义多个有符号长长整形的数的话你是会在每一个函数里面都敲 signed long long int 吗?不,我们才不会呢。通过typedef关键字就可以解决了。就好像下面的这个例子,我把这一长串用一个SLLI就给替代了。在主函数和test函数中都可以直接使用。无需再打那么多。
#include <stdio.h>
typedef signed long long int SLLI;
int main()
{
SLLI a;
printf("Please input\n");
scanf("%d",&a);
printf("you input is %d\n",a);
test();
return 0;
}
void test()
{
SLLI b=-987654;
printf("test is %d",b);
return 0;
}
运行结果
二、#define
#define 不会占用内存,编译结束就会将定义的符号丢弃掉。当编译器在进行编译的时候遇到#define会直接替换,所以ta不存在报错。他存在的意义是为了什么呢?例如当我们需要计算圆的周长和面积的时候都需要用到π,不同的题目对π的精度要求不同,那么我们是不是需要一个一个的去改呢??不需要。一次定义,替换所有。例如下面的例子,在函数中所有的PI其实被编译之后都是当做3.14在进行使用,如果我们需要更改精度,直接在#define PI 3.14这里改一次就可。
#include<stdio.h>
#define PI 3.14
int main()
{
int r;
printf("Please input radius of circle:");
scanf("%d",&r);
printf("面积%.2f\n",PI*r*r);
printf("周长%.2f",2*PI*r);
return 0;
}
运行结果
三、异同区别
在讲区别的时候需要先见一下C语言程序执行的流程。
1.typedef只能为变量类型进行定义,而#define除了可以对变量类型进行定义之外还可以为数字、字母进行定义。可以通过下面的程序看出
#include <stdio.h>
#define C char
#define PI 3.14
int main()
{
C b[10];
printf("Please input:\n");
scanf("%s",&b);
printf("you input is '%s'",b);
printf("\nPI=%.2f",PI);
return 0;
}
运行结果
2.处理typedef和#define的对象不同,typedef是由编译器进行处理。而#define是由预编译器进行处理。(额,技术有限这个无法给大家展示出来)
3.相同之处就是这二者都有一个不成文的规定就是将名字全部都大写。还有就是二者的定义范围相同,既可定义在主函数里面也可以定义在主函数外面。
四、typedef 在结构体中的应用
#include<stdio.h>
typedef struct student{
int sid;
char name[20];
}ST;
int main()
{
ST st1;//等价于 struct student st1;
st1.sid=20200101;
printf("sid=%d",st1.sid);
return 0;
}
【运行结果】
#include<stdio.h>
typedef struct student{
int sid;
char name[20];
}* PST; //等价于 struct student *
int main()
{
struct student st;
PST ps=&st;
(*ps).sid=20200101;
printf("sid=%d",ps->sid);
return 0;
}
【运行结果】
#include<stdio.h>
typedef struct student{
int sid;
char name[20];
}* PST,ST; //等价于 struct student *和 struct student
int main()
{
ST stu;//
PST ps=&stu;
ps->sid=20200202;
printf("sid=%d",ps->sid);
return 0;
}
【运行结果】