struct tag
{
member-list;
}variable-list;
1.1.2结构体变量的创建和初始化
//在上面代码的基础上,下面代码合法吗?
p = &x;
警告: 编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。 匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用?次。
typedef struct S
{
int a;
int b;
int c;
}s1;
int main()
{
struct S s = { 10,20,30 };
struct S s2;
return 0;
}
在结构中包含?个类型为该结构本身的成员是否可以
struct Node
{
int date;
struct Node next;
};
上述代码正确吗?如果正确,那 sizeof(struct Node) 是多少?
struct Node
{
int date;
struct Node * p;
};
在结构体自引用使用的过程中,夹杂了 typedef 对匿名结构体类型重命名,也容易引入问题,看看 下面的代码,可行吗?
typedef struct
{
int date;
Node * next;
}Node;
答案是不行的,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。
解决方案如下:定义结构体不要使用匿名结构体了
typedef struct Node
{
int date;
Node * next;
}Node;
struct S1
{
char c1;
int i;
char c2;
};
#include <stdio.h>
struct S
{
int data[1000];
int num;
};
struct S s = { {1},10 };
void print1(struct S s1)
{
printf("%d\n", s.num);
}
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);
print2(&s);
return 0;
}
结构体名并不是和数组,函数一样时地址,而是和其他变量一样,在函数传参时,形参是实参的临时拷贝。此时如果结构体很大,直接传结构体会造成空间的浪费,不如传结构体地址
struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
};
//后面的数字表示一个变量所占的比特位
//_a是变量名
//变量名的组成:字母,数字,下划线,首字符不能是数字
A就是一个位段类型
那A位段所占的内存是多大呢?