data_fun_struct

对数据结构、存储结构、C语言的指针,函数、结构体等知识点的讲解

1、存储结构

1
2
3
4
5
6
7
8
9
10
11
12
13
1、数组:
a、一位数组:数组名 《==》数组的首地址,数组的起始地址,首元素的地址
一维数组名:列性质的地址
*(array + i) 每次移动到下一个地址(地址偏移)
*代表解引用,根据所在的地址,获取该地址上的内容
b、二维数组:数组名《==》数组的起始地址
二维数组数组名:行性质地址
a[0] 列性质地址
&a[0][0]列地址
*(*(a+i)括号中的*,表示降级处理,将a+i由行性质地址转换
结论:a[i]《=》*(a+i)
一维组中*,代表解引用
二维数组中* 代表降级处理

2、指针

1
2
3
4
5
6
7
8
9
1、指针变量在内存上占有4字节,与其指向无关
普通指针是列指针,保存的是指向的数据所在内存的地址。如:int *p[3];/2、
2、数组指针:指向数组的指针,不同于普通指针,数组指针是行指针数组指针是数组:是可以指向数组的指针
例: int (*p)[4];
3、指针数组:数组里面放的指针,指针里面放的地址
数组,数组中的元素是指针(可以是普通指针或函数指针),保存的是地址
4、函数指针与指针函数的区别:
Int (*p)(int a,int b)函数指针
(Int *)p(int a,int b)指针函数

3、结构体

1
2
3
4
5
struct 结构体名{
成员名;
成员名;
…….
}

3.1访问结构体

1
2
1)变量名:变量名.成员名=值;
2)指针:指针变量名->成员名

4、IO

IO:input output

文件IO:采用的方式是系统调用

对文件进行读写的功能由内核完成。

操作方式:先打开(open),后读(read)写(write)

5、函数

a、函数原型:

1
2
3
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int open(const char *pathname, int flags, mode_t mode);

功能:打开一个文件或设备

参数:一、pathname:路径名(文件名)

​ 二、flags :当前进程对该文件的操作权限

需要有下面的其中的一个(1-6)

​ 1.O_RDONLY 只读方式打开

​ 2.O_WRONLY 只写方式

​ 3.O_RDWR 读写方式

The file is opened in append mode.

​ 4、O_APPEND 以追加的方式打开数据

​ 5、O_CREAT 文件不存在,会自动创建一个

​ 6、O_TRUNC 如果文件有数据,就会清空文件

​ (1)O_RDONLY 只读方式打开,文件必须存在,否则就会出错

​ (2)O_RDWR读写方式,文件必须存在,否则就会出错

​ (3)O_WRONLY|O_CREAT|O_TRUNC 以只写的方式打开文件,如果文件不存在,会自动创建,如果文件已存在,有数据。则清空原有的数据

​ (4) O_RDWR|O_CREAT|O_TRUNC 以读写的方式打开文件,如果文件不存在,会自动创建,如果文件已存在,有数据。则清空原有的数据

​ (5)O_WRONLY|O_CREAT|O_APPEND 以只写的方式打开文件,如果文件不存在,会自动创建,如果文件已存在,以追加的方式进行访问

​ (6)O_RDWR|O_CREAT|O_APPEND 以读写的方式打开文件,如果文件不存在,会自动创建,如果文件已存在,以追加的方式进行访问

mode

当flags指定O_CREAT,必须有第三个参数;

mode:该文件所属用户对该文件的执行权限:如rwxrwxr-x:0775

【返回值】RETURN VALUE

open() and creat() return the new file descriptor, or -1

​ if an error occurred (in which case, errno is set appro‐

​ priately).即:返回值:成功 文件描述符(非负数)

​ 失败 -1

mode与umask(权限掩码,屏蔽权限值)à(化为二进制取反相与)取反

当打开文件,文件的描述符是从3开始,0,1,2是系统默认的

​ 0:标准输入

​ 1:标准输出

​ 2:标准出错输出

b、函数原型

1
ssize_t write(int fd,void *buf,size_t count)

功能:期望读取count个字节数据

参数:fd文件描述符

​ Buf 保存读取的数据

​ Size_t 读取的个数

返回值;成功 实际读取的个数

​ 失败 返回-1


6、数据结构

1)概念:数据结构体数组研究的是数据和数据之间的关系。

2)数据(data): 数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。数据就是研究对象。

3)数据元素(data element): 数据元素是数据的基本单位,又称之为记录(Record)。

4)数据项:数据项是数据元素的最小单位。

5)数据类型(data type): 数据类型是对数据元素取值范围与运算的限定。

6)数据结构指的是数据的逻辑结构和存储结构及其操作

​ a、逻辑结构:表示数据运算之间的抽象关系(如邻接关系、从属关系等),按每个元素可能具有的直接前趋数和直接后继数将逻辑结构分为“线性结构”和“非线性结构”两大类

​ 线性结构——一个对一个,如线性表、栈、队列

​ 树形结构——一个对多个,如树

​ 图状结构——多个对多个,如图

​ b、存储结构:逻辑结构在计算机中的具体实现方法,分为顺序存储方法、链接存储方法、索引存储方法、散列存储方法。

c、顺序存储:数据在内存当中存储时,需要开辟一块连续的空间,使用数组,为了方便操作,定义数组下标来标识数组现有元素的个数。

​ d、链式存储:不需要开辟一块连续的空间,所以每一个数据不再是单纯的数据,而是一个结点,由两部分组成,数据域和指针域,指针域里面存储下一个结点的地址。

操作:增、删、改、查

1、单链表(线性表的链式存储)的实现

1)头文件:

1
2
#include <stdio.h>
#include <stdlib.h>

2)定义数据类型:

1
2
3
typedef int datatype_t;
指针域是指向下一个指针节点。
创建一个指针变量的头结点不放数据,则指向空(即为NULL)

3)定义结点结构体

1
2
3
4
typedef struct node{
datatype_t data;//数据域
struct node *next;//指针域,保存下一个结点的地址,并且能够访问下一个结点的数据,类型指定为结构体类型
}linklist_t;

4)创建一个空链表:

1
2
3
4
5
6
linklist_create(){
//创建一个头结点,数据域不放数据,指针域指向NULL标识为空
Linklist_t *h=(linklist_t *)malloc(sizeof(linklist_t));
h->next=NULL;
return h;
}

执行原理图:

5)插入数据

1
2
3
4
5
6
7
8
9
10
11
void linklist_insert_head(linklist_ t *h,datatype_t value){
//申请空间并赋值
linklist_t *temp = (linklist_t *)malloc(sizeof(linklist_t));
temp->data = value;
//将头结点的下一个结点的地址保存在新插入的结点的指针域里面
temp->next = h->next;
//将新插入的结点的地址保存在头结点的指针域里面
h->next = temp;
return ;//
}

6)打印数据

1
2
3
4
5
6
7
8
9
void linklist_show(linklist_t *h){
while(h->next != NULL)
{
h = h->next;
printf("%d ", h->data);
}
putchar(10);
return ;
}

7)main函数中调用上面的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(int argc, const char *argv[])
{
linklist_t *h = linklist_create();
linklist_insert_head(h, 10);
linklist_insert_head(h, 20);
linklist_insert_head(h, 30);
linklist_insert_head(h, 40);
linklist_insert_head(h, 50);
linklist_insert_head(h, 60);
linklist_show(h);
return 0;
}

执行结构为: