C语言知识点总结
1.进制转换
整数十进制转二进制:除以2取余数,把余数按照从低位到高位依次表示
小数十进制转二进制:乘以2 取整 取到规定的位数
0.2====>
0.2
2
0.4-----------0
2
0.8-----------0
2
0.6-----------1
2
0.2-----------1
== 0011 0011 0011 ......
= 0011 0011 00
0.25====>
0.25
2
0.5-----------0
2
0.0-----------1
== 01
二进制转十进制:二进制每一位的权 乘以 当前位的值 (权:以2为底数,以位数为指数幂)的累加和
10101 ====>
1 * 2^0 + 0 * 2^1 + 1 * 2^2 + 0 * 2^3 + 1 * 2^4
= 1* 1 + 1 * 4 + 1 * 16 = 1 + 4 + 16 = 21
十六进制转十进制:十六进制每一位的权 乘以 当前位的值 (权:以16为底数,以位数为指数幂)的累加和
7A======>
A * 16^0 + 7 * 16^1 = 10 + 112 = 122
十进制转十六进制:除以16取余数,把余数按照从低位到高位依次表示
234
/ 16---------10(A)
14
/ 16--------14(E)
0
234=====>EA
二进制转十六进制/八进制:把四位/三位 二进制转为一个十六进制位/八进制位,如果高位不够补0进行转换
10101010111====>16进制
0 101 0101 0111===> 5 5 7
10101010111====>8进制
010 101 010 111====>2 5 2 7
2.数的存储
原码:数据的二进制格式
10:0 .....0000... 1010
-10:1 .....0000... 1010
反码:
正数:反码 == 原码
负数:在原码的基础上每一位(除了符号位)取反(1变为0,0变为1)
10:0 .....0000... 1010
-10:1 .....1111... 0101
补码:
正数:补码 == 原码
负数:在反码的基础上 + 1
10:0 .....0000... 1010
-10:1 .....1111... 0110
3.基本数据类型
short (int):短整型------16位二进制(16bit),2B
int:整型-------------32位(32bit),4B
long (int):长整型-------在32位系统大小为 32位(32bit),4B ;在64位系统大小为 64位(64bit),8B
long long (int):超长整型----64位(64bit),8B
有符号数:
(signed):有符号数,最高位为 符号位
无符号数:
unsigned:无符号数,没有符号位
32位无符号整数:unsigned int
16位有符号整数:signed short int--------->short
4.浮点型
float:单精度浮点型---32位(32bit),4B,精度:6/7
符号位:1bit
阶码:8bit
尾数:23bit
double:双精度浮点型-----64位(64bit),8B,精度:15/16
符号位:1bit
阶码:11bit
尾数:52bit
5.位运算符
<<(按位左移)
数据值 << 移动位数
将一个数据所有二进制位向左移若干位,左边(高位)移出的部分舍去,右边(低位)自动补零
>>(按位右移)
数据值 << 移动位数
将一个数据所有二进制位向右移若干位,右边(低位)移除的部分舍去,左边(高位)根据原最高位自动补值(原最高位为1:补1,元最高位为0,补0)
指针
指针类型,都是统一的大小,各个类型之间没有区别
32位机器:4B
64位机器:8B
1.指针与一维数组
因为数组名可以表示数组首地址,而指针变量也可以存储数组首地址,在访问数组的操作时,指针变量和数组名作用一致,所以
数组名[n]:访问数组的n元素 ==== 指针名[n]
int *p,a[5];
p = a;
p + n == a + n//等价
a[n] == *(p+n) == *(a+n) == p[n]
基于指针变量,可以将指针当做数组用,不能越界
2.字符数组
字符数组中存储的字符串,要求在字符串结束的下一个字符位置存储'\0'
'\0'字符就表示 字符串的结束
循环可以通过判断‘\0’是否存在来终结循环
3.指针与二维数组
数组名是整个二维数组的首地址
每个元素是一个一维数组,在元素(一维数组)中,每个成员就是一个值
二维数组:
数据类型数组名[行][列]
行:有多少个一维数组
列:一维数组的元素个数
a[0]:表示二维数组的元素零,第零个一维数组,a[0]是一维数组的数组名,在这个一维数组的首地址
a[0] == &a[0][0]
a[0]+1 == &a[0][1]
a[1]:第一个一维数组,也是这个一维数组的数组名(首地址)
a[1] == &a[1][0]
a[1]+1 == &a[1][1]
数组指针:
是一个指针,指针用于存储整个数组的地址,指针的指向类型为数组
定义:
数组元素类型 (* 指针变量名)[大小];
int (*p)[4];//定义一个指针变量,指针变量存储 整个数组的地址(int [4])
4.数组指针
数组指针和二维数组名是等价的,因为二维数组表示第零个元素(一维数组)的地址
int a[3][4];
int (*p)[4];
p = a;//&a[0]
所以:
p+1 == a+1 == &a[1]
*(p+1) == a[1]
*(p+1)+2 == &a[1][2]
*(*(p+1)+2) == a[1][2]
5.指针数组
指针数组:是一个数组,只是每个元素为指针类型
指向类型 * 指针数组名[元素个数];
int * p[5];
定义 包含 5个元素 每个元素为指针(int *)
6.多级指针
一级指针:存储变量的地址
二级指针:存储一级指针的地址:一级指针类型 * 指针名;
三级指针:存储二级指针的地址:二级指针类型 * 指针名;
int **p;
int * a[10];
p = a;
p+1 == a+1;
*(p+2) == a[2]
二级指针与指针数组名等价
指针与函数
指针作为函数的参数:可以表示变量的地址,或者是数组名/数组首地址,作用就是表示参数为地址
指针作为函数返回值:返回一个地址,把指针作为函数的结果返回
把地址作为参数进行传递
函数指针:指针存储是的函数的地址
函数地址:
函数名就是用于表示函数的地址
函数指针 = 函数名;
调用函数:
通过函数指针进行调用
函数指针名(实参);
构造类型
1.结构体
使用多种数据类型作为成员,进行组合,构成的新的类型,就叫做结构体
struct结构体名字
{
类型1 成员1;
类型2 成员2;
类型3 成员3;
};
2、共用体(联合体)
使用多种数据类型作为成员,进行组合,但是使用同一段空间存储(多个成员共用一个空间),构成的新的类型,就叫做共用体
使用共用体的问题:同一时刻只能操作一个成员
声明共用体类型:
union 共用体名
{
类型1 成员1;
类型2 成员2;
类型3 成员3;
};
3、枚举
枚举就是定义一种新类型时,这个类型能够取值的范围是确定的,通过这个定义的新类型把能欧取值的范围一一列举出来,这种类型就叫做枚举
声明枚举类型:
enum枚举名
{
成员1,
成员2,
成员3,
};
常用的字符串函数
//把src首地址的字符串,拷贝到dest首地址中
char *strcpy(char *dest, const char *src);
//比较字符串s1 和 s2 是否相等,如果相等返回0,如果不等返回当前字符的差值
int strcmp(const char *s1, const char *s2);
//计算 s 字符串的字符个数(不算'\0'),返回值就是字符串的长度
size_t strlen(const char *s);
//把src字符串 拼接到 dest字符串后
char *strcat(char *dest, const char *src);
动态内存
栈中变量,只要离开了变量的生命周期,变量就会由系统销毁释放
堆空间:有程序员在程序中,自己进行管理的空间,需要使用时进行申请,由自己进行释放销毁。空间的申请与释放都是由程序员在程序中指定,通过地址指针进行访问空间,根据指针的类型就按照对应类型进行访问,就叫做动态内存
malloc函数在堆空间中申请指定大小的内存空间
free就是释放malloc申请的空间
Linux基础
Linux是免费开源的内核程序
Linux操作系统:
ubuntu
debian
deepin
red hat
centos
Linux系统体系架构
shell:命令解释器,通过shell提供内核的功能
1、内核
内核是linux系统中最底层,提供系统中核心功能并允许有序访问硬件资源
用于管理:
输入输出设备、进程的执行情况、文件系统的操作、内存管理
linux内核支持:
多任务、多用户
2、文件系统
文件系统就是用于组织和管理计算机存储设备上的大量文件
windows中使用NTFS文件系统格式
linux中格式多,目前通用EXT4文件系统格式
linux文件系统的逻辑结构(linux目录结构):
linux中 文件系统把文件组织为倒置的树,每一个文件夹(目录)当做树的分支
文件系统只有一个起始点叫做根: / ---根
Linux文件系统把一切所有内容都看做文件,Linux一切皆文件
Linux文件系统就是一个 树形的目录结构:
将 / 作为整个文件系统的起点,其他的所有目录都是从根开始
Linux文件系统存储文件:
/:根目录
/bin:存储系统中最常用的可执行程序
/boot:存储Linux系统启动文件
/dev:存储系统中的设备文件,包括硬盘、鼠标、键盘
/etc:存储系统配置文件,如passwd存储用户信息
/home:普通用户的家目录位置
/lib:存放共享库
/media:存储cd、软盘、usb临时读入的文件
/mnt:挂载的文件系统挂载点
/opt:作为可选程序和文件存放目录
/proc:当前执行的进程的文件存储目录
/root:超级用户的家目录
/sbin:作为扩展的,更多的二进制程序存储目录
/usr:标准库、第三方库存储目录
3、shell
shell叫做命令解释器,当执行程序时,把程序中的各种操作命令进行解释执行,通过命令解释器让内核执行对应操作,可以提供一种用户与操作系统交互的方式
常用目录文件命令
pwd:用于查询显示用户当前的工作路径
cd:改变用户当前的工作路径(改变工作目录)
mkdir:创建目录文件,在指定路径下创建目录
rmdir:删除空目录
ls:列出目录或文件的内容项
文件命令
-n:添加行号
tail:查看文件最后几行
head:查看文件前几行
模板:head -n 文件路径
-n:显示n行