C语言 | #define与typedef的区别?

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

1、#define

#define是预处理指令,在编译时不进行任何检查,只进行简单的替换

宏定义的一般形式为:

#define 宏名 字符串

这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。

 

2、typedef

typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与autoexternmutablestaticregister等关键字不能出现在同一个表达式中。

typedef取别名的一般形式为:

typedef  旧名字  新名字

 

3、#define与typedef的区别

1#define之后不带分号,typedef之后带分号。

2#define可以使用其他类型说明符对宏类型名进行扩展,而 typedef 不能这样做。如:

#define INT1 int

unsigned INT1 n;  //没问题

typedef int INT2;

unsigned INT2 n;  //有问题

INT1可以使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。

3)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。如:

#define PINT1 int*;

P_INT1 p1,p2;  //即int *p1,p2;

typedet int* PINT2;

P_INT2 p1,p2;  //p1、p2 类型相同

PINT1定义的p1p2类型不同,即p1为指向整形的指针变量,p2为整形变量;PINT2定义的p1p2类型相同,即都是指向 int 类型的指针。

下面看一个关于typedef的重要的问题!!请看代码:

#include <stdio.h>

typedef char *pStr;

int main(void)
{
	char string[4]="abc";	//第一行代码
	const char *p1=string;	//第二行代码
	const pStr p2 = string; //第三行代码
	p1++;					//第四行代码
	p2++;  					//第五行代码 
	
	return 0;
}

这段代码编译会报一个错误(error: increment of read-only variable 'p2'),错误在哪呢?

答案与解析:

第五行代码p2++出错了。这个问题提醒我们:typedef#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2const pStr p2pStr const p2本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,即为char* const p2,表明p2是一个指向char类型的常指针,所以p2是不可修改的,因此p2++错误。

 

下面看一看关于const声明的一些例子及其含义:

const int a;     //

int const b;     //

const int *c;    // 

int * const d;   //  

int const * e const;  // 

a是常数,不可改变; 

b是常数,不可改变

c是一个指向整型常数的指针,指针可以变,指针指向的内容不可以变;

d是一个指向整型变量的常指针,指针不可以变,指针指向的内容可以变;

e是一个指向整型常数的常指针,指针与指针指向的内容都不可变。

以上就是关于#define与typedef区别的笔记,如有错误欢迎指出!

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式大杂烩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值