首页 > 代码库 > 扎实学习C语言(二)结构和联合

扎实学习C语言(二)结构和联合

关于结构体的一个问题:

看下面这个结构体的声明,把它记作A

struct node
{


	int a;
	float b;
	struct node *next;
}s;


和如下的结构体声明,把它记作B
struct node
{


	int a;
	float b;
	struct node  next;
}s;


他们的区别是啥?


今天学习《C和指针》第10章,以前,没注意过这个问题,现在对声明和定义的理解又深了一点

声明是要告诉编译器,这个甜饼机做出来的甜饼有多大,但是甜饼机不是甜饼本身,定义就是甜饼本身!

B中的结构体声明不正确,是因为编译器会认为  在 代码语句 : struct node next 这里是使用了未定义的标识符,因为此时struct node 这个结构体还没有声明成功,为什么?因为声明是要告诉编译器你该给我这个变量预留多大的空间,而此时struct node 结构体的大小并不知道,甜饼机都没有完成,当然吃不到甜饼啦!


A中的struct node * 是指针类型,我们知道指针类型在windows 32位机器上都是4字节,所以,编译器分析到代码句:: struct node *next时,你就可以知道我这个next变量是四个字节,从而完成声明的工作


你会发现,next的类型换做任意结构体指针,都是可以正确编译的,比如,struct unknown *next ;  此时虽然 struct unknown并没有声明,也是正确的,因为,编译器此时并不关心具体的标号,我只关心我的工作,那就是分配内存!