字符串函数:
常量字符串: 只要是双引号引起来的字符序列
ps: 常量字符创存储在常量区, 常量区用户只能读不能写
1、在c 语言中, 使用字符数组存储字符串的
2、使用指针变量接收的是一个常量字符串的起始地址,字符串仍然存储在常量区
使用字符数组接收一个常量字符串, 直接将常量字符串存储到数组中,可以修改字符串的值!
strcpy: 将src指向的字符串拷贝到dest指向的内存中, 包括尾零一起拷贝过去
strlen:计算字符串可见字符的个数,不包含尾零
strcmp:比较两个字符串大小,相等为0,前大于后为正数否则为负数。
memcpy:从存储区 str2复制 n个字节到存储区 str1。
strcat:将第二个字符串粘贴到第一个字符串‘\0’处;
struct结构体:
1、定义结构体:本质就是构造数据类型, 可以理解成一张图纸
2、定义结构体语法:
struct 结构体名称
{
类型 成员1;
类型 成员2;
。。。
类型 成员n;
};
3、定义结构体变量:
struct 结构体名称 变量名;
4、如何访问结构体变量中的成员: .
结构体变量.成员名称: 表示结构体变量中的某个成员
5、没有名称的结构体其他地方不能使用,只能定义结构体的同时定义变量!!!
结构体对齐原则:
1、每一个成员按照自己的字节数对齐
2、最后总的字节数是最大对齐数的整倍,如果不是,加到第一个整数倍为止
3、结构体的对齐数就是最大成员的对齐数
4、如果有成员是数组,则按照每一个元素的大小对齐
ps : 成员按照从小到大的顺序排列是最节省空间的!!!!
套结构体: 在一个结构体中组合了另一种结构体类型的成员变量
注意事项:
1、定义结构体时,每一个成员的类型必须是已经存在的
2、如果A结构体中嵌套了B类型的结构体成员变量,B结构体需要在A结构体之前定义
3、每一个结构体变量只能访问自己的成员,如果是嵌套结构体, 首先访问嵌套的结构体成员变量,
然后再访问它的成员,需要一级一级的访问
关键字
ypedef: 给已经存在的数据类型取别名
语法: typedef 类名名称 别名;
头文件包含:
1、源文件 , xx.c, 存放函数具体实现的过程
2、头文件, xx.h , 存放对应模块的函数声明 、结构体定义、宏定义、全局变量的声明
3、一个模块包含两部分: 源文件+头文件, 文件一样,后缀名不同
4、如果包含C 库或者系统的头文件, 使用 <>,
如果包含自己写的头文件,使用 “”
5、如何防止头文件重复包含, 有两种方法:
(1) #ifndef _头文件名称大写_H
#define _头文件名称大写_H
头文件内容..
#endif
(2) pragma once
6、如果头文件和源文件不在同一个路径下,如何包含:
(1)包含头文件时,写清楚具体的路径
#include "具体路径"
(2)编译时提供头文件目录所在的路径
gcc xx.c -o xx -I 头文件目录路径
内存四区:
内存四区:
栈区: 存储临时变量, 局部变量、 形参 、保护现场
堆区: 是由程序员自己管理, 申请空间:malloc 释放:free
数据段: 存储全局变量/静态变量/常量
未初始化数据段:未初始化的全局变量和静态变量, 默认初始化为0
初始化数据段:初始化的全局变量和静态变量
常量区: 常量, const +静态变量/全局变量, 只读的
正文段: 运行的代码 , 只读的
malloc函数:用户向堆申请空间;
p=(p数据类型指针)malloc(p数据类型);
注意事项:
1、内存越界
2、内存泄露
3、不要二次释放,释放一次就可以了
4、释放完内存后,让指针指向NULL
static:
1、修饰变量: 静态变量, 生存期: 程序开始-----》程序结束
作用域: 静态局部变量, 定义函数内部
静态全局变量, 定义本 .c 文件内部
2、修饰函数: 内部函数, 只能在定义的文件内部调用
举: 定义一组常量
语法:
enum 名称
{
常量1,
常量2,
常量3,
。。。
常量n,
};
ps :默认常量值从0开始,后面依次递增
可以使用gdb常看枚举值 : p \d 常量名称
文件操作:
1、打开文件
fopen
FILE *fopen(const char *pathname, const char *mode);
参数:
pathname: 文件路径
mode: 打开模式, 文本文件: r/w/a, 二进制文件: rb/wb/ab
返回值:
成功: 返回有效的地址
失败: NULL
2、读写文件
二进制读写:fread/fwrite
文本读写: fscanf/fprint
3、关闭文件
fclose
单链表