typedef与define

typedef与define这个两个关键字都是给变量取别名,初学c语言的时候我是分不清楚它们的区别的。只知道它们是取别名的,具体的细节不懂,语法也不太清楚,更不懂使用的时机。如今我学会了,就去网上bbll分享一通个人的见解。

他们的作用:

起别名,最大作用就是简化复杂声明和改一个易于记忆的名字

一般情况下的它们如下语法:

typedef语法 :

typedef unsigned char uchar;

定义了一个uchar代表unsigned char 这个类型。
define语法:

#define PI 3.14

定义了一个PI表示3.14

typedef的几种使用的用法:

typedef 定义的新类型与编译系统固有的类型使用起来没有差别。
一、给已定义的变量类型起个别名

typedef unsigned char uchar;
typedef signed short  INT16;
typedef signed int    INT32;//等等

二、定义指针类型

#include <stdio.h>
#include <string.h>

typedef int *pint; //定义pint 是 int*类型
	

int main()
{
	pint pi;
	int i = 10;
	pi = &i;
	printf("%d", pi);  //输出 10
}

三、定义函数指针类型

#include <stdio.h>
#include <string.h>


typedef void(*PADD)(int a, int b);//定义了一个函数指针

void add(int a, int b)
{
	int tmp = a + b;
	printf("sum = %d", tmp);
}
int main()
{
	PADD pADD = add;
	pADD(10, 20);
	return 0;
}

	

然后你会想,这不是更麻烦并且没啥用吗?
但当一个函数的参数是一个函数的时候(有点绕也就是回调函数)
没有typedef:

void RECALLBACK(char *pc, int i, void *add(int a, int b))
{
	//....实现就不写了,很多遍历函数,都会有传函数指针让用户决定如何操作,线程函数也是如此
}

有typedef:

typedef void(*PADD)(int a, int b);//定义了一个函数指针

void add(int a, int b)
{
	int tmp = a + b;
	printf("sum = %d", tmp);
}

void RECALLBACK(char *pc, int i, PADD padd)
{
	//PADD是类型名 padd是变量名
}

四、定义结构体类型

typedef struct Student
{
	char* name;
	int number;
}Student, *PStudent; //Student是结构体,PStudent是结构体指针

typedef与#define的区别

  • #define 进行简单的进行字符串替换。 #define 宏定义可以使用 #ifdef、#ifndef 等来进行逻辑判断,还可以使用 #undef 来取消定义。
  • typedef 是为一个类型起新名字。typedef 符合(C语言)范围规则,使用 typedef定义的变量类型,其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。 通常,使用 typedef 要比使用 #define 要好,特别是在有指针的场合里。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

困了就喝白茶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值