1.构造结构体类型
struct 结构体类型名{
成员一的定义;
成员二的定义;
等等;
}
struct Student
{
int sn;
int age;
char sex;
int s[3];
};
注:1.定义成员的方式与定义普通变量的方式一样
2.成员列表必须用一对花括号括起
3.结构体名可以省略
2.定义结构体变量
先构造结构体类型再定义结构体变量-->
struct Student
{
int sn;
int age;
char sex;
int s[3];
};
struct Student stu1,stu2,st[25];
在构造结构体类型的同时可以定义结构体变量-->
struct Student
{
int sn;
int age;
char sex;
int s[3];
}stu1,stu2,st[25];
类型、变量同时定义,类型名Student省略-->(之后不能再定义新的类型的变量了)
struct
{
int sn;
int age;
char sex;
int s[3];
}stu1,stu2,st[25];
结构体变量在内存中占用字节数为各成员占用字节数总和-->
struct aa
{
int num;//2
char name[10];//10
};
struct bb
{
int a;//2
float b;//4
struct aa c;
};
struct bb a;
问:计算sizeof(a)的值是多少?
答:18
指针无论什么类型都占2个子节-->
double a;
double *b;
double c[5];
sizeof(a);//8
sizeof(*b);//2
sizeof(c);//40
若有定义语句char *pt[3];则sizeof(pt)为多少?
答:6,因为这是指针数组
3. 使用结构体变量、结构体数组、结构体指针变量
在定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中,来进行对结构体变量的初始化。若初值个数多于成员个数,则出错;若初值个数少于成员个数,则无赋值的成员默认为0。
struct aa
{
int a;
char b[30];
float c;
}a1={30,"zhangsan",40.5},b1={40,"lisi",50.4},c1;
结构体变量不能整体引用,只能引用它的成员。 引用结构体成员的方式:结构体变量.结构体成员 其中(.)为成员运算符
printf("a1=%d,%s,%f"a1.a,a1.b,a1.c);
a1.a=80;
strcpy(a1.b,"xinjiang");
a1.c=30.2;
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;
当指针变量p指向结构体变量aa时,引用aa中成员的方式:
aa.num;
(*p).num;
p->num;
struct student
{
int num;
char name[20];
char sex;
float score;
};
struct student stu[3]={{1001,"zhang",'M',80.5},{1002,"peng",'M',90.5},
{1003,"wang",'W',81.5}};
struct student *p = stu;
//调用“wang”的三种方法
stu[0].name;
p->name;
(*p)[0].name;
//调用1002;
stu[1].num;
(p+1)->num;
(*p)[1].num;
注:1)可以用结构体变量的成员作为实参,它与普通变量作为实参的用法是一样的。
2)用结构体变量作为实参时,要求形参必须是同一结构体类型的变量,传递后形参与实参个对应成员值是一样的。
3)也可以用结构体类型的地址(指针变量或数组)作为实参,要求形参必须是同一结构体类型的指针变量或数组。只要是地址传递,则可以通过形参来改变实参的值。