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

C语言学生管理系统(准备工作1)

程序员文章站 2022-05-06 09:10:31
...

结构体

当我们要记录一串数据时,会想到去使用数组,但数组只能记录相同类型的几个数据,如果我们想要用一个“数组”记录一个学生的基本信息呢?它需要有名字(字符串),学号(字符串或整型),成绩(整型),甚至还要有家庭住址等等,这时候我们就需要定义一个结构体了——也就是集多种类型于一身的类型。

·声明一个结构体

struct Stu
{
	char name[10];
	char num[10];
	int grade;
}stu; 

声明位置

在函数内:局部可用
在函数外:全局可用

Stu是结构体的类型标识符,它和关键字struct一起构成一个结构体类型名称,stu是结构体变量名。

这里刚开始有些不太好理解,你可以这么想,Stu是一个结构体类型的总名称,所有叫Stu的结构体里面就会有三个元素(name,num,grade),但它并不能直接使用,而stu是声明出的一个变量,是真正拿来用的,你还可以继续声明stu1,stu2等等(这里有点像Java里类和对象的关系)。

注意:结构体定义要以 ;结尾!

对于结构体变量,你可以写在 } 和 ;的中间,如果有很多个用,隔开,也可以单独定义,如:

struct Stu str1;

声明结构体时也可以不写类型修饰符(但非常不建议):

struct 
{
	char name[10];
	char num[10];
	int grade;
}stu;

这样的话你就只有声明时的那一个(或者几个)变量可以使用了,无法声明新的变量,因为这个结构体没有类型名。

·定义结构体变量

你可以直接按顺序定义:

struct Stu stu = { "Kz","12345678",100 };

也可以用 . 来访问定义:

stu.grade = 100;
strcpy(stu.name, "Kz");

在这里要注意,在给name赋值时,要用strcpy而不能直接用 =,当然也别忘了包含字符串的头文件。

·访问

用 . 访问 (-> 访问指针)

·结构体数组

struct Stu stu2[3];
stu2[3] = { {   },{   },{   } };
stu2[0].name

·内存对齐/字节对齐

对齐是数据存储的规则,每种类型的数据都存在各自的字节数。
当用sizeof求一个结构体大小时
为结构体最后一个成员的偏移量再加上成员本身的大小
但有两个稍微麻烦一点的规则:
1、 成员偏移量必须是成员大小的整数倍
2、 结构体大小必须是每个成员大小的整数倍
不足时向上补齐
例如:

struct Node
{
	char a;		//偏移量为0
	int b;		//偏移量应是0+1=1,但不是int大小(4)的整数倍,向上补齐后为4
	char c;		//偏移量是4+4=8
};
//大小为8+1=9,但又不是int大小的整数倍,所以补成12。

注:
当成员中有数组类型时,计算偏移量时只看成员类型(一个元素)的大小,计算成员大小时计算整个数组大小(即每个元素大小*元素个数)

这里大家可以自己声明几个结构体试着计算他们的大小,然后用sizeof 求出来看一看,注意用sizeof 时使用的是结构体的变量名

printf("%d", sizeof(stu));

·多说一点

接下来就要创建一个链表,以及之后的各种链表操作了
我先说说我对链表的理解吧:
声明一种结构体类型,装上你想要的数据,然后在声明一个结构体指针,指向下一个节点,下一个节点里同样装有数据,结构体指针指向在下一个节点,直到最后一个(尾节点)的指针指向空。

struct Node
{
	int data;
	struct Node* pTemp;
};

在这之中,储存你想要的数据的就是数据域,储存指针的就是指针域。

链表的样子大概就是这样:
C语言学生管理系统(准备工作1)
这样每一个链表的每一个节点就互相连接上了。

感谢你能看到这里,以上仅凭自学知识整理,难免有不足甚至是错误,也希望大家能提出宝贵意见。

相关标签: C语言