关于数据结构的基础知识

在学习数据结构之前,我们需要学习一些必备知识。

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, &quot;Alice&quot;); //给s1的name成员赋值为&quot;Alice&quot;//如果你要单独初始化这个name变量,只能使用strcpy函数来对它进行复制,但别忘了使用这个函数需要用#Include<string.h>头文件

s1.score = 95.5; //给s1的score成员赋值为95.5

当然也可以这样赋值辣,一下把他们都赋完值例如

struct Student s1={ .id = 1001,

.name = &quot;alice&quot;

.score=95.5}; //这叫初始化语句初始化

printf(&quot;s1's id is %d\n&quot;, s1.id); //打印s1的id成员的值

printf(&quot;s1's name is %s\n&quot;, s1.name); //打印s1的name成员的值

printf(&quot;s1's score is %.2f\n&quot;, s1.score); //打印s1的score成员的值

这样,我们就可以对结构体变量中的每个成员进行赋值或读取操作。

结构数组

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值