AutoLeaders控制组-结构体学习笔记
一、定义和使用结构体变量
1.1自己建立结构体类型
要自己建立结构体类型,首先需要定义一个结构体,然后在程序中使用这个结构体。以下是一个简单的示例:
#include <stdio.h>
// 定义结构体类型
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
// 使用结构体类型创建变量
Student stu1 = {1, "张三", 95.5};
Student stu2 = {2, "李四", 88.0};
// 输出结构体变量的值
printf("学生1的ID: %d, 姓名: %s, 成绩: %.2f
", stu1.id, stu1.name, stu1.score);
printf("学生2的ID: %d, 姓名: %s, 成绩: %.2f
", stu2.id, stu2.name, stu2.score);
return 0;
}
在这个示例中,我们定义了一个名为 Student 的结构体类型,包含三个成员: id (整数类型)、 name (字符数组类型)和 score (浮点数类型)。然后我们在 main 函数中创建了两个 Student 类型的变量 stu1 和 stu2 ,并分别赋值。最后,我们使用 printf 函数输出这两个变量的值。
1.2定义结构体类型变量
为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。可以采取以下3种方法定义结构体类型变量。
1、先声明结构体类型,再定义该类型的变量
2、在声明类型的同时定义变量
3、不指定类型名而直接定义结构体类型变量
1.3结构体变量的初始化和引用
结构体变量的初始化可以通过以下几种方式:
1、直接赋值:将一个结构体类型的值赋给另一个结构体类型的变量。
#include <stdio.h>
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
Student stu1 = {1, "张三", 95.5};
Student stu2 = {2, "李四", 88.0};
printf("学生1的ID: %d, 姓名: %s, 成绩: %.2f
", stu1.id, stu1.name, stu1.score);
printf("学生2的ID: %d, 姓名: %s, 成绩: %.2f
", stu2.id, stu2.name, stu2.score);
return 0;
}
2、使用 memset 函数:将结构体类型的内存空间初始化为指定的值。
#include <stdio.h>
#include <string.h>
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
Student stu1;
memset(&stu1, 0, sizeof(Student)); // 将结构体变量stu1的内存空间初始化为0
strcpy(stu1.name, "张三");
stu1.id = 1;
stu1.score = 95.5;
printf("学生1的ID: %d, 姓名: %s, 成绩: %.2f
", stu1.id, stu1.name, stu1.score);
return 0;
}
3、使用 memcpy 函数:将一个结构体类型的内存空间复制到另一个结构体类型的内存空间。
#include <stdio.h>
#include <string.h>
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
Student stu1 = {1, "张三", 95.5};
Student stu2;
memcpy(&stu2, &stu1, sizeof(Student)); // 将结构体变量stu1的内存空间复制到stu2的内存空间
printf("学生1的ID: %d, 姓名: %s, 成绩: %.2f
", stu1.id, stu1.name, stu1.score);
printf("学生2的ID: %d, 姓名: %s, 成绩: %.2f
", stu2.id, stu2.name, stu2.score);
return 0;
}
二、使用结构体数组
2.1定义结构体数组
结构体数组是指由多个相同类型的结构体组成的数组。定义结构体数组的语法如下:
struct 结构体名 {
数据类型 成员1;
数据类型 成员2;
...
};
struct 结构体名 数组名[数组大小];
例如,定义一个表示学生信息的结构体数组:
#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student students[3] = {
{"张三", 18, 90.5},
{"李四", 19, 85.0},
{"王五", 20, 92.5}
};
for (int i = 0; i < 3; i++) {
printf("学生%d的信息:姓名:%s,年龄:%d,成绩:%.2f
", i + 1, students[i].name, students[i].age, students[i].score);
}
return 0;
}
三、结构体指针
3.1指向结构体变量的指针
指向结构体变量的指针是一个变量,它的类型是指向该结构体类型的指针。通过这个指针,我们可以访问和操作结构体变量的成员。
下面是一个指向结构体变量的指针的例子:
#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student student1 = {"张三", 18, 90.5};
struct Student *student_ptr = &student1; // 创建一个指向结构体变量的指针
printf("学生姓名:%s\n", student_ptr->name); // 通过指针访问结构体变量的成员
printf("学生年龄:%d\n", student_ptr->age);
printf("学生成绩:%.2f\n", student_ptr->score);
return 0;
}
在这个例子中,我们定义了一个名为 Student 的结构体类型,包含三个成员变量: name 、 age 和 score 。然后我们创建了一个名为 student1 的结构体变量,并使用 & 运算符获取其地址,将其赋值给一个名为 student_ptr 的指针变量。最后,我们通过 student_ptr 指针访问和输出了结构体变量的成员。
3.2指向结构体数组的指针
指向结构体数组的指针是一个变量,它的类型是指向该结构体类型的指针。通过这个指针,我们可以访问和操作结构体数组的元素。
下面是一个指向结构体数组的指针的例子:
#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student students[3] = {
{"张三", 18, 90.5},
{"李四", 19, 85.0},
{"王五", 20, 92.5}
};
struct Student *student_ptr = students; // 创建一个指向结构体数组的指针
for (int i = 0; i < 3; i++) {
printf("学生%d姓名:%s\n", i + 1, student_ptr[i].name); // 通过指针访问结构体数组的元素
printf("学生%d年龄:%d\n", i + 1, student_ptr[i].age);
printf("学生%d成绩:%.2f\n", i + 1, student_ptr[i].score);
}
return 0;
}
在这个例子中,我们定义了一个名为 Student 的结构体类型,包含三个成员变量: name 、 age 和 score 。然后我们创建了一个长度为3的 Student 结构体数组 students ,并使用 students 初始化一个名为 student_ptr 的指针变量。最后,我们通过 student_ptr 指针遍历结构体数组,输出每个元素的成员信息。
3.3用结构体变量和结构体变量的指针作函数参数
结构体变量和结构体变量的指针都可以作为函数参数。下面是一个示例:
#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
void print_student(struct Student s) {
printf("姓名:%s\n", s.name);
printf("年龄:%d\n", s.age);
printf("成绩:%.2f\n", s.score);
}
void print_student_pointer(struct Student *s) {
printf("姓名:%s\n", s->name);
printf("年龄:%d\n", s->age);
printf("成绩:%.2f\n", s->score);
}
int main() {
struct Student stu1 = {"张三", 18, 90.5};
struct Student *stu2 = &stu1;
print_student(stu1);
print_student_pointer(stu2);
return 0;
}
在这个示例中,我们定义了一个名为 Student 的结构体类型,包含三个成员变量: name 、 age 和 score 。然后我们定义了两个函数 print_student 和 print_student_pointer ,分别接受一个结构体变量和一个指向结构体变量的指针作为参数。在 main 函数中,我们创建了一个 Student 类型的变量 stu1 和一个指向 Student 类型的指针 stu2 ,并将它们分别传递给这两个函数。