C语言结构体的使用
有时候需要将不同类型的数据组合为一个整体,以便于引用。例如,一名学生有学号、姓名、性别、年龄等属性,如果针对每个属性都单独定义一个变量,那么当有多名学生时变量就难以分清。结构体就是用来管理不同类型的数据组合。结构体的声明与定义
结构体的声明一般形式为:
c
struct 结构体名{
成员1;
成员2;
...
}; //注意分号
例如:
c
struct student{
int num;
char name;
char gender;
int age;
};
结构体定义:
c
//struct 结构体名 变量名
struct student s;
结构体的初始化只能在定义时进行:
c
struct student s={100,"John",'M',20}; //定义并初始化
如果已经定义了结构体,就不能再初始化了,只能对它的每个成员单独赋值,如s.num=1;
结构体成员的访问
采用“结构体变量名.成员名”的形式来访问结构体成员。
c
#include <stdio.h>
//工作中往往把结构体声明放在头文件中
struct student{
int num;
char name;
char gender;
int age;
};
int main() {
struct student s={100,"John",'M',20}; //定义并初始化
struct student sarr; //结构体数组
s.age = 21;
printf("%d %s %c %d\n",s.num,s.name,s.gender,s.age);
printf("---------------------\n");
for (int i = 0; i < 3; ++i) {
scanf("%d%s %c%d",&sarr.num,sarr.name,
&sarr.gender,&sarr.age);
}
for (int i = 0; i < 3; ++i) {
printf("%d %s %c %d\n",sarr.num,sarr.name,
sarr.gender,sarr.age);
}
return 0;
}
执行结果:
结构体指针
一个结构体变量的指针就是该变量所占据内存段的起始地址。
结构体指针的使用:
c
#include <stdio.h>
struct student{
int num;
char name;
char gender;
int age;
};
int main() {
struct student sarr={1,"KK",'F',18,
2,"HH",'M',20,
3,"LL",'M',19};
struct student *p; //定义结构体指针
p=sarr;
//获取成员方法一,成员运算符优先级高于取值运算符,所以要加括号(*p).num
printf("%d %s %c %d\n",(*p).num,(*p).name,(*p).gender,(*p).age);
//获取成员方法二,更为常用的方法
printf("%d %s %c %d\n",p->num,p->name,p->gender,p->age);
printf("---------------\n");
p=p+1;
printf("%d %s %c %d\n",p->num,p->name,p->gender,p->age);
return 0;
}
执行结果:
结构体对齐
结构体对齐是为了cpu高效存取内存上的数据。
先运行以下程序观察结构体的大小:
c
#include <stdio.h>
typedef struct A {
int a;
char b;
short c;
}A;
typedef struct B {
char a;
int b;
short c;
}B;
int main() {
A a;
B b;
printf("A size is %d\n",sizeof(a));
printf("B size is %d\n",sizeof(b));
return 0;
}
执行结果:
结构体对齐是为了cpu高效存取内存上的数据。 已经定义了结构体,就不能再初始化了
页:
[1]