typedef与#define的战斗

 在C语言中typedef和#define有着许多的相似之处也有着不同之处那么他们各自是怎么使用的,又有怎样的不同呢?Let’s go.

一、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;
}

【运行结果】
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

127.0.0.1/24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值