一、结构体类型
1、构造结构体类型
struct 结构体类型名
{成员1的定义;
成员2的定义;
成员n的定义;
};
例如:
struct student
{int sn;
int age;
char sex;
int s[3];
};
注:
(1)定义成员的方式与定义普通变量的方式一样。
(2)成员列表必须用一对花括号括起。
(3)结构体名可以省略。
2、定义结构体变量
三种格式
A.先定义(构造)结构体类型名再定义结构体变量
例如:
main()
{
struct student//类型名
{int sn;
int age;
char sex;
int s[3];
};
/*类型定义*/
struct student stul,stu2,st[25];/*变量定义*/
}
B.在定义结构体类型的同时可以定义结构体变量
例如:
struct student
{int sn;
int agc;
char sex;
int s[3];
}stul,stu2,st[25];
C.类型、变量同时定义,类型名student省略。(一般不用)
例如:
struct
{int sn:
int age;
char scx;
int s[3];
int*p;
}stul,stu2,st[25];
注:(1)结构体变量在内存中占用字节数为各成员占用字节数总和。
例如:
sturct aa
{int num;
char name[10]:
};
struct bb
{int a ;
float b;
struct aa c;
};
struct bb a:计算:sizcof(a)的值是多少?
注意:char数组是每个元素占一个字节
结果:2+10+2+4=18
例:
double a;
double*b;
double c[5];
则:sizcof(a),sizcof(b),sizeof(c)的值分别为:
8 2 40
例:
若有定义语句char*pt[3];则sizcof(pt)的值为:
2*3=6
指针占字节数始终为2字节
3、结构变量的初始化及引用
使用结构体变量、结构体数组、结构体指针变量
(1)在定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中,来进行对结构体变量的初始化。若初值个数多于成员个数则出错,若初值个数少于成员个数,则多余成员自动赋0。
struct aa
{int a;
char b[10];
float c;
}al={30,"china",40.5},a2={60,"kunming"},a3;
(2)结构体变量不能整体引用,只能引用它的成员。(同数组相似)
引用结构体成员的方式:
结构体变量名.成员名
其中(.)为成员运算符。
如:
printf("al=%d,%s,%f",al);非法
printf("a1=%d,%s,%f",al.a,al.b,al.c);
al.a=80;
al.b="xinjiang";//非法:常量不能放在=左边
al.c=60.5;
- 注意:“.”是成员运算符,与()[]共同为一级运算符
4、指向结构体数据类型的指针
(1)指向结构体变量的指针
可以用指针变量指向结构变量也可能用指针变量指向结构体变量中的成员。要注意指针变量的类型必须与它所指向变量的类型相同。当指针变量指向结构体变量时,对指针变量加1则跳过整个结构体而不是跳过一个成员。
如:
struct student
{int num;
char name[20];
char sex;
float score;
};
struct student aa={1001,"zhang",'M',80.5};
struct student*p&aa;
char*q=aa.name;
int*r=&aa.num;
struct student aa{1001."zhang",M,80.5}.
struct student*p=&aa;
char*q=aa.name;
int*r=&aa.num;
当指针变量p指向结构体变量aa时,引用aa中成员的方式有三种:
aa.num
(*p).num
p->num ->指向运算符
aa.score
(*p).score
p->score
(2)指向结构体数组的指针
struct student
{int num;
char name[20];
char sex;
float score;
};
struct student stu[3]={
{1001,"zhang",:M,60.5},
{1002,"peng",VM,100},
{1003,"wang";w,90.9}
};
struct student*p=stu;
例题:
访问zhang:
stu[0].name
p->name
(*p).name
访问1002:
stu[1].num
(p+1)->num
(*(p+1)).num
访问w:
stu[2].sex
(p+2)->sex
(*(p+2)).sex
注:
(1)可以用结构体变量的成员作为实参,它与普通变量作为实参的用法是一样的。
(2)用结构体变量作为实参时,要求形参必须是同一结构体类型的变量,传递后形参与实参各对应成员值是一样的。
(3)也可以用结构体类型的地址(指针变量或数组)作为实参,要求形参必须是同一结构体类型的指针变量或数组。只要是地址传递,则可以通过形参来改变实参的值。
二、链表
在C语言之链表中有详细介绍,这里篇幅太长不做赘述
三、共用体类型
在C语言之共用体类型中有详细介绍,这里篇幅太长不做赘述
四、typedef
在C语言之typedef中有详细介绍,这里篇幅太长不做赘述