码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-05-07 03:19:10      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:blog   class   code   ext   int   2014   

关于结构体的一个问题:

看下面这个结构体的声明,把它记作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并没有声明,也是正确的,因为,编译器此时并不关心具体的标号,我只关心我的工作,那就是分配内存! 

扎实学习C语言(二)结构和联合,布布扣,bubuko.com

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

标签:blog   class   code   ext   int   2014   

原文地址:http://blog.csdn.net/jw_45840/article/details/25008475

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!