在学习数据结构之前,我们需要学习一些必备知识。
ps:前情提要,代码粘贴的时候我发现引号"被解码为",请读者注意。
sizeof()函数模型:
sizeof是c语言的的内置符,以字节为单位给出指定类型的数据大小,c99(c语言)和c11(c++)提供%zd转换说明匹配sizeof的返回类型。
这是一个简单的sizeof函数的例子
运行结果
接下来是malloc()函数:
这是一个在数据结构非常容易看到的一个函数,它可以动态分配内存空间,它的参数是要分配的内存大小,以字节为单位。它的返回值是一个指向分配内存的指针,如果分配成功的话。如果分配失败,它会返回NULL,表示没有足够的内存。比如可以要求用4字节来存储”joe“;这个字符串(因为j,o,e,/0,最后有一个空字符,dont 忘了字符串的定义)举个例子来比喻下malloc(),你可以把malloc函数想象成一个开房间的服务员,你告诉他你要多大的房间,他就去找一间合适的空房给你,并给你房间的钥匙(指针)。如果他找不到空房,他就会说对不起,客满了(NULL)。
malloc函数只负责开房间,不负责打扫房间。所以你得到的房间里可能有各种杂物(随机值),你要自己清理一下(初始化)。当你不再使用这个房间时,你要把钥匙还给服务员,并告诉他你退房了(free函数这个我们下面再说)。这样他才能把这个房间再次出租给别人。
free()函数:
这个函数上文已经说到了,就在这里讲了吧·。free函数是一个用来释放内存的函数,故名思意,一般都会和malloc函数在一起,一个分配内存,一个释放内存。他的函数原型是这样的free(*ptr);比如malloc给int *p分配了内存,现在需要把内存给释放,就是free(p),free的参数也就是(*ptr)是一个指向要释放内存的指针,这个指针必须是之前由malloc、calloc或realloc函数返回的。
说一下相关的例子,并且和你说一下malloc和free有什么好处。
假设你想要存储一个用户输入的字符串,但是你不知道字符串的长度,你可以这样写:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *str; //定义一个字符型指针变量str
char buffer[100]; //定义一个字符型数组buffer,用来存储用户输入
printf(”请输入字符串: “;); //提示用户输入
scanf(”%s“, buffer); //读取用户输入到buffer中
str = (char *)malloc(strlen(buffer) + 1); //根据buffer的长度,分配一个合适大 小的内存,并把内存的首地址转换为char *类型,赋值给str
strcpy(str, buffer); //把buffer中的字符串复制到str指向的内存中
printf(“你输入的字符串时: %s\n”, str); //打印str指向的字符串
free(str); //释放str指向的内存
return 0; }
malloc和free函数的好处是:
1.你可以根据实际需要,动态地分配和释放内存,而不是事先固定一个大小。
2.你可以节省内存空间,因为你只分配了刚好够用的内存,而不是浪费了多余的内存。
3.你可以避免内存泄漏,因为你及时地释放了不再使用的内存,而不是让它们一直占用着。
最常见的东西struct结构体!!!:
struct其实就是一个超级数组
struct是一个用来定义复合数据类型的关键字,它可以把不同类型的数据项组合成一个整体,称为结构体。结构体可以看作是一个模板,它描述了结构体中的每个成员的类型和名称。例如:
struct Student {
int id; //学号
char name[20]; //姓名
float score; //成绩
};
这里,我们定义了一个名为Student的结构体类型,它包含了三个成员:id、name和score。每个成员都有自己的类型和名称。
你可以把struct想象成一个盒子,它可以装下不同种类的东西,比如书、笔、手机等。每个东西都有自己的标签和位置,你可以通过标签和位置来找到它们。
要使用结构体,我们需要创建结构体变量,也就是给这个盒子起一个名字,并分配一些内存空间给它。我们可以在定义结构体时就创建变量,也可以在定义后再创建变量。例如:
//在定义结构体时就创建变量
struct Student {
int id;
char name[20];
float score;
} s1, s2; //创建了两个Student类型的变量s1和s2
//在定义后再创建变量
struct Student {
int id;
char name[20];
float score;
}; //注意这里要有分号
struct Student s1, s2; //创建了两个Student类型的变量s1和s2
这样,我们就有了两个盒子,分别叫做s1和s2,它们都是Student类型的,也就是说它们都有id、name和score三个成员。
要访问结构体变量中的成员,我们需要使用点运算符(.)。点运算符是结构体变量名和我们要访问的成员名之间的一个点。例如:
s1.id = 1001; //给s1的id成员赋值为1001
strcpy(s1.name, "Alice"); //给s1的name成员赋值为"Alice"//如果你要单独初始化这个name变量,只能使用strcpy函数来对它进行复制,但别忘了使用这个函数需要用#Include<string.h>头文件
s1.score = 95.5; //给s1的score成员赋值为95.5
当然也可以这样赋值辣,一下把他们都赋完值例如
struct Student s1={ .id = 1001,
.name = "alice"
.score=95.5}; //这叫初始化语句初始化
printf("s1's id is %d\n", s1.id); //打印s1的id成员的值
printf("s1's name is %s\n", s1.name); //打印s1的name成员的值
printf("s1's score is %.2f\n", s1.score); //打印s1的score成员的值
这样,我们就可以对结构体变量中的每个成员进行赋值或读取操作。
结构数组