关于结构体的一个问题:
看下面这个结构体的声明,把它记作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语言(二)结构和联合
时间: 2024-10-05 09:14:03