“typedef关键字尽管在语法上是一种存储类型,但正如其名所示,它用来定义新的类型名称,而不是定义新的变量或函数”
—Steve Summit
一、typedef和#define有什么不同?
#define是基于文本的字符替换,不做类型检查。而typedef的替换并不完全基于文本,它不是简单的字符替换,它定义一种类型的别名,typedef的优点是可以用作同时声明多个指针类型的对象。举个例子:
这样声明的话,S1和S2中只有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 *p和char const *p、char * const p有什么区别?
const char *p和char const *p是一样的,它们都是定义了一个指向字符常量的指针(就是说这个指针所指向的字符不能被改变)。而char * const p意思是定义一个字符指针,这个指针本身不可改变,但指针指向的字符可以被改变。
五、struct S1{....};和typedef struct {....} S2;有什么不同?
举例:
第一种struct S1声明了一个结构体标签(structure tag)“S1”。第二种声明了一个typedef类型定义的结构体,在声明typedef类型定义的结构体实例时不需要使用struct关键字(第15-16行)。