数据结构的定义:

数据结构是一种存储、组织数据的方式,在便于访问和修改。没有一种单一的数据结构对所有用途均有效,所以需要知道几种数据结构的优势和局限。

在学习数据结构之前,我们需要学习一下这些知识点

  1. 函数
  2. 数组
  3. 字符串
  4. 指针
  5. 内存解析
  6. 结构体

函数

1
2
函数是干嘛的?有哪些场景?
可以解决一些重复性代码的编写。在我们编写代码的时候,可能会遇到无数的重复代码,这种类型太麻烦了,所以我们需要封装成函数,每次调用时只要写函数名即可。

函数的额四种形态

  1. 无参数,无返回值
  2. 无参数,有返回值
  3. 有参数,无返回值
  4. 有参数,有返回值

在日常写代码的时候,函数怎么时候加参数?什么时候加返回值?

我们需要基于需求来看要不要加参数和返回值。

字符串

初始化

在 C 语言中,没有字符串这个数据类型,我们通常是用一个数组来保存我们的字符,来达到一个字符串的形式。

A B S E C \0

我们会在结尾的时候加一个”\0”用来告诉计算机,这个是一个字符串。

1
char str[] = "ABSEC";

我们这种属于是直接初始化了。

那我们在看一种情况

1
2
3
4
5
6
#include "stdio.h"
int main() {
char str[11];
str = "absec";
return 0;
}

我们可以这样来进行初始化字符串吗?

1
2
3
4
5
6
7
不行,为啥不行呢?
报错:
无法分配给 数组类型 char[11]
为什么?
在C语言中,数组名在大多数情况下会转换为指向其首元素的常量指针(即数组名是地址常量,不能被修改)。因此,`str = "absec";` 试图将字符串字面量的地址赋给数组名,这是不合法的,因为数组名不是可修改的左值。

也就是说,`str` 这个数组名,一旦定义好了,它的“地址”就固定了,不能再把另一个字符串硬塞给它。

那我们该怎么写呢?

1
2
3
4
5
6
7
#include "stdio.h"
#include "string.h"
int main() {
char str[11];
strcpy(str, "ABSEC");
return 0;
}

数组

数组我们需要知道的一个点就是,数组的长度一旦定义就不能改变了。

数组中的每一个元素可以用下表表示位置,如果一个为数组中有 n 个元素,那么下表的取值范围是 0~n-1.

我们用一个遍历数组的例子来复习:

1
2
3
4
5
6
7
8
9
10
11
12
#include "stdio.h"
#include "string.h"
int main() {
//创建一个数组,并便利这个数组,用sizeof计算数组的长度
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int len = sizeof(arr)/sizeof(arr[0]);
for(int i = 0;i<len;i++){
printf("%d",arr[i]);
}
printf("\n");
return 0;
}
1
2
3
我们得知道什么是 sizeof()  	返回这个函数参数当中在内存中的字节数。
在代码中,我们有一个 len 的变量,这个是用来知道这个数组一共有几个数据在里面
首先是 sizeof(arr)是表示这个数组总有占内存几个字节,sizeof(arr[0])表示数组中第一个元素占用了几个字节。那么我两个相处,不就知道我这个数组有几个数了吗?

指针

什么是指针

指针是用来存放内存地址的变量,我们常用的 int,float,char 是用来存放 123,123.123,hello 这样类型的数据。如果说我定义了一个 int 类型的指针变量的话,那我们这个指针变量存档嗯就是一个 int 类型的地址。

指针声明

1
2
int a;			//声明一个整形变量
int *p; //声明一个指针变量,改指针指向了一个int类型值的内存地址。

指针的使用

1
2
3
4
int a;
int *p;
a = 5;
p = &a;

这个代码不难理解,但是我们可以看看这个代码在内存中的变化是什么样子的。假设我们的内存是从 101 这个地址开始的,我们在 101 里面放了这个 a。然后在 105 里面放了一个 p,我们给 a 赋值的是 5,然后 p 赋值的是 a 的内存地址。如下图

img

我们把这个代码完善一下:

img

这时可能就有人要问了,我这个指针存了这个地址可以干嘛?能做什么事情?

我们可以通过指针去改其他变量的指,就像我们上面这个代码,我们可以通过修改指针 p 来修改我们 a 的值。