C语言学习-struct结构体定义你自己的数据类型
程序员文章站
2022-03-31 09:36:32
前言:
在java中有类,内部封装的是一些相关联的数据,例如一个学生,有姓名,年龄,性别,班级,学校等等,这些数据组合到一起就构成了我们的类。而在C中,也可以定义这样一个&lsq...
前言:
在java中有类,内部封装的是一些相关联的数据,例如一个学生,有姓名,年龄,性别,班级,学校等等,这些数据组合到一起就构成了我们的类。而在C中,也可以定义这样一个‘类’(当然C语言中没有类这个概念),那就是结构体--struct,通过结构体把这些相关联的数据给组合起来。
如何定义一个结构体
struct Student{ char name[20]; int age; char sex; ..... }
可以看到,这与java定义一个类差不了多少,每个成员的命名规则与变量一样。
PS:
结构体中的成员同样也可以是结构体 例如:
struct Date { int year; int month; }; struct Student{ char name[20]; struct Date date; };可以看到,这是不是像java的内部类?当然这里仅仅是个比喻,方便理解。
定义好一个结构体之后,如何来使用这个结构体呢?
结构体的初始化以及使用
#include "stdafx.h" #include using namespace std; //声明结构体的同时进行变量声明和初始化 struct Date { int year; int month; }date1 = {2017, 8}; //仅仅定义一个结构体 struct Student{ char name[20]; //struct Date date; int age; }; //定义结构体的同时声明结构体变量 struct Student1{ char name[20]; int age; }student1, student2; //声明一个结构体,成员含有另一个结构体 struct Student2 { int age; struct Date date; }; //不指定类型名直接定义结构体 struct { char name[20]; int age; }man = {"11", 11}; int main() { //定义一个结构体变量,并初始化 Student student = {"张三", 11}; cout << student.age << endl; cout << student.name << endl; //为声明好的结构体变量初始化,在定义结构体时已经声明了 student1 = { "李四", 22 }; cout << student1.age << endl; cout << student1.name << endl; //为声明好的结构体变量初始化,在定义结构体时已经声明了 student2 = { "王五", 33 }; cout << student2.age << endl; cout << student2.name << endl; //初始化 Student2 student3 = { 44, date1 }; //如果结构体的成员也是一个结构体,那访问方式是一级级访问下去的 cout << student3.date.year << endl; //没有结构体类型的变量man cout << man.age << endl; cout << man.name << endl; cin.get(); return 0; }
看上面代码可以清楚的了解到,大概有4种方式
1.仅仅只定义一个结构体,然后在方法中声明结构体变量并初始化;
2.定义结构体的同时,声明结构体变量,然后在方法中初始化;
3.定义结构体的同时,声明结构体变量并初始化;
4.定义一个结构体,但是不指定结构体类型,这种定义方式后面必须同时声明该结构体的变量,不然没有任何作用。
输出结果我这就不展示了,可以拿上面代码测测。或者自己动手敲敲便于理解。
使用方式: 结构体变量.成员 ,结构体成员就和普通的变量一样,可以对其操作 赋值算术运算等。
当然除此之外,还可以使用指针来访问,通过指向操作->或者是(*p).name,其中p是指向结构体变量的指针。
#include "stdafx.h" #include using namespace std; struct Student { char name[20]; int age; }; int main() { Student student = { "ljx", 20 }; Student *p = &student; //(*p)返回student这个变量 cout << (*p).name << endl; cout << (*p).age << endl; //指针的指向操作 cout << p->name << endl; cout << p->age << endl; cin.get(); return 0; }
如果不太理解的,可以看下我上篇关于指针的文章。
结构体数组
假如我们定义一个学生类型的结构体,一个班级上有40个学生,那就需要用数组把他们给整合起来,这样的数组就是结构体数组。
#include using namespace std; struct Student{ char name[20]; int age; }; int main(){ Student student[3] = {{"zhangsan", 20}, {"lisi", 30}, {"wangwu", 40}}; //通过数组下表操作结构体数组 for(int i = 0; i < 3; i++){ cout<name<age<
结构体基本就分析到这,当然还有一些没有讲解的,例如公用union 共用体结构,结构体变量所占用的内存长度是各个成员的内存长度之和,而共用体则是内部定义的成员从同一个地址开始的,这个相对而言用的较少,所以这里也就没有对其进行讲解。
PS:学会了结构体,那我们可以通过结构体来定义一个链表/双向链表/二叉树等都难不倒我们了。