欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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:学会了结构体,那我们可以通过结构体来定义一个链表/双向链表/二叉树等都难不倒我们了。