本文为对C语言结构体的初步学习
一、何为结构体
结构体是由不同类型的数据构成的一个整体,是C语言提供的一种专门的构造类型。
二、结构体定义
struct 结构体名{
成员变量;
}
例如:构造一个学生类型Stu,它包含姓名,性别,年龄,学号四个属性。
struct Stu{ //Stu为结构体的标签
char name[20]; //成员类型
char sex[5];
int age;
char no[11];
}stu; //相当于创建了一个struct Stu 类型的全局变量stu;可省略
注意:
1、结构体定义时不允许对结构体本身递归定义。例如:
struct Stu{
char name[20];
struct Stu s;
}; //这种定义是错误的
2、结构体内可以包含其他的结构体。例如:
struct Stu{
char name[20];
char sex[5];
int age;
char no[11];
};
struct class{
int num; //人数
struct Stu s; //学生信息
};
3、定义结构体类型时,并没有分配空间,就像系统不会给int类型本身分配空间一样。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。
4、结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列。
三、结构体初始化
将结构体各成员的初值,按顺序地放在一对大括号{ }中,并用逗号分开。
1、直接赋值初始化:可以在定义结构体变量的同时,直接给其成员赋值。
struct Stu{
char name[20];
char sex[5];
int age;
char no[11];
}s={"张三","男",25,"100001"}; //定义struct Stu 类型的结构体s并初始化赋值
#include<stdio.h>
struct Stu{
char name[20];
char sex[5];
int age;
char no[11];
};
int main(){
struct Stu s={"张三","男",25,"100001"};
return 0;
}
2、逐个成员初始化:可以逐个成员地给结构体变量赋值。例如:
struct Stu {
char name[20];
int age;
};
struct Stu s;
strcpy(s.name, "张三");
s.age = 25;
3、使用成员名初始化:可以使用成员名来初始化结构体的对应成员。例如:
struct Stu {
char name[20];
int age;
};
struct Stu s={.name="张三",.age=25};
4、动态内存分配初始化:可以使用malloc
函数动态分配结构体内存,并对其成员进行赋值。例如:
struct Stu {
char name[20];
int age;
};
struct Stu *s = malloc(sizeof(struct Stu));
strcpy(s->name, "张三");
s->age = 25;
一般使用第一种初始化赋值方法。
四、结构体的使用
较多使用“.”运算符,它的优先级最高。
举例:
#include<stdio.h>
typedef struct Stu { //利用typedef标识符将结构体重命名为Stu
char name[20];
char sex[5];
int age;
char no[11];
}Stu;
void print1(Stu s) { //将结构体的值传给形参
printf("姓名:%s\n", s.name);
printf("性别:%s\n", s.sex);
printf("年龄:%d\n", s.age);
printf("学号:%s\n", s.no);
}
void print2(Stu* p) { //将结构体的地址传给形参
printf("姓名:%s\n", p->name);
printf("性别:%s\n", p->sex);
printf("年龄:%d\n", p->age);
printf("学号:%s\n", p->no);
}
int main() {
Stu s = { "张三","男",25,"100001" }; //初始化赋值
print1(s); //利用.操作符打印成员的值
printf("----------------\n");
print2(&s); //利用指针->操作符打印成员的值
return 0;
}
运行结果:
附:以上代码中的两个打印函数,print2较于print1更好;因为函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销就比较大,就会导致性能降低。
五、结构体数组
1、定义:
struct Stu {
char name[20];
int age;
};
struct Stu s[5]; //定义一个包含5个struct Stu类型的数组
2、初始化
struct Stu {
char name[20];
int age;
};
struct Stu s[5]={{"张仨",18},{"李四",19}};
3、结构体数组的访问
用数组下标访问每一个结构体元素,跟普通数组的用法是一样的。
#include<stdio.h>
struct Stu {
char name[20];
int age;
};
int main(){
struct Stu s[5] = { {"张仨",18},{"李四",19} };
printf("名字:%s", s[0].name);
printf(" 年龄:%d\n", s[0].age);
printf("名字:%s", s[1].name);
printf(" 年龄:%d\n", s[1].age);
return 0;
}