《你的月亮我的C》(一):类型定义(typedef)

本文探讨了C语言中typedef与#define的区别、结构体自我引用、const限定符的应用、不同类型指针的区别以及结构体标签的使用等高级主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    “typedef关键字尽管在语法上是一种存储类型,但正如其名所示,它用来定义新的类型名称,而不是定义新的变量或函数”

                                                                                                                                                                —Steve Summit

一、typedef#define有什么不同?

#define是基于文本的字符替换,不做类型检查。而typedef的替换并不完全基于文本,它不是简单的字符替换,它定义一种类型的别名,typedef的优点是可以用作同时声明多个指针类型的对象。举个例子:

这样声明的话,S1S2中只有S1被定义为char *字符指针,而S2被定义为char型字符变量。所以说有时想定义两个指针变量时,使用#define做字符替换可能会出错。

 

二、C语言结构体中可以包含指向自己的指针?

当然可以。

那为什么这样定义不行:


我们来看下编译器报错:


问题在于,不能在定义typedef类型前使用它,在上图中,对于Next的定义前还没有定义*Node,所以编译器报错。

C语言允许同时定义一个新的typedef类型和结构体类型。所以解决的办法有两个。

1、:在定义typedef类型和结构体类型后,给结构体类型一个标签。


然后在定义Next时定义为struct QNode *的指针。

2、typedef定义新类型和结构体定义分开来。


在定义结构体前先定义typedef类型,然后在结构体内定义Next时就可以用Node来声明了。

三、为什么不能在初始化数组大小时使用const限定值?

例子:


(摘自:Steve Summit“因为const限定词真正的含义时“只读”,用它限定的对象通常时运行时不能被赋值的对象。因此用const限定的对象的值并不完全是一个真正的常量,不能用作数组维度、case行标或类似环境。”

如果你真的需要一个编译时的常量,那么可以使用编译预处理宏#define


四、const char *pchar const *pchar * const p有什么区别?

const char *pchar const *p是一样的,它们都是定义了一个指向字符常量的指针(就是说这个指针所指向的字符不能被改变)。而char * const p意思是定义一个字符指针,这个指针本身不可改变,但指针指向的字符可以被改变。

五、struct S1{....};typedef struct {....} S2;有什么不同?

举例:


第一种struct S1声明了一个结构体标签(structure tag)“S1”。第二种声明了一个typedef类型定义的结构体,在声明typedef类型定义的结构体实例时不需要使用struct关键字(第15-16行)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值