结构体是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。
用宏定义使一个符号常量来表示一个结构类型。
例如:
#define STU struct stu //宏定义后面没有逗号
STU
{
int num;
char name[20];
char sex;
float score;
};
STU boy1,boy2;
一.结构体的变量的说明方式:
1.先定义在说明。2.在定义结构体的同时说明结构体变量。3. 直接说明结构体变量 如:struct { int num; char *stu} boy1,boy2;
结构体指针的使用和说明:
一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。
二.结构指针变量说明的一般形式为:
struct 结构名 *结构指针变量名;
如:
struct stu *pstu;
当然也可在定义stu结构时同时说明pstu。
与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。
赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。
stu boy;
如果boy是被说明为stu类型的结构变量,则:
pstu=&boy
是正确的,而:
pstu=&stu
是错误的。
还有一种情况声明结构体指针不给其分配内存,必须先声明变量(才能分配内存)再把变量的地址复制给结构体指针,不然只能只是一个指针,不能引用结构体里面的成员;
在对成员进行引用的时候要注意:
例如:
(*pstu).num
或者:
pstu->num
应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。
三.动态存储分配
数组的长度是预先定义好的,在整个程序中固定不变,C语言中不允许动态数组类型。
例如:
int n;
scanf("%d",&n);
int a[n];
用变量表示长度,想对数组的大小作动态说明,这是错误的。严重错误!!!!!!!记住啊!!
共用体:
定义:
union 共用体名
{
成员列表;
} 变量列表;
union data
{
int i;
char ch;
float f;
} a,b,c;
公用的占用的内存的最大长度等于最长的成员的长度;
共用体变量的引用方式:
必须先定义共用体的变量才能引用它,而且不能引用共用体变量,只能引用的是共用体变量中的成员,如
a.i; a.ch;
共用体的作用:
1.每一个瞬间只有一个成员起作用,其他的成员不起作用;
2.公用体变量中起作用的是最后一次存放的成员,再存入最后一个新的成员的时候原有的成员的就失去了作用,如: a.i =5;a.c =‘a’; a.f = 1.5;
此时只有a.f是有效的,其他的成员是没有意义的。
3.共用体的变量的地址和他的成员的地址都是同一个地址,如:&a,&a.i ,&a.c,&a.f 都是同一个地址;
4.不能对共用体变量名进行赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量的时候对其初始化。如:union {int a; int b;} ch={5,6}
ch = 1; m =a;都是错误的;
5.不能把共用体变量作为函数的参数,也不能使函数带回共用体变量,但是可以使用的是公用体的指针(与结构体变量的使用相仿);
共用体和结构体可以互相嵌套;
枚举类型:
声明是用的enum开头,如:enum weekday{sun,mon,tue,wed,thu,fri,sat}
声明之后就可以用enum weekday 定义变量;
enum weekday workday;
workday被定义成枚举变量之后就只能是sun 到sat中的一个。如:workday = sat;
sun,mon,tue,wed,thu,fri,sat被称为枚举元素或者是枚举常量;他们只是标识符,必须的用户自己定义他们的含义;
1枚举元素都是常量是不能赋值的 sun = 0;是错误的!!!
2.枚举元素是有值的,可以给枚举的变量赋值,如enum weekday work = sun;
3.一个整数必须在强制转换之后才能赋值给一个枚举变量, workday = (enum weekday )6;