C语言操作符详解(1)7.9
操作符和表达式
算数操作符
/除号得到的是商
%模得到的是余数
Double浮点数
移位操作符
>>右移位
- 算术右移(计算机常用)
右边丢弃,左边补原符号位
- 逻辑右移
右边丢弃,左边补零
原码,反码,补码
左移操作符
左边丢弃,右边补零
没有右移-1位
位操作符
& 按位与 (按二进制位)
| 按位或
^ 按位异或(相同为0,相异为1)
不创建临时变量交换数值,加减法(超出最大值,可能会溢出)
进一步,用异或
赋值操作符
创建时给值是初始化
复合赋值符
+=
>>=
单目操作符
A+b 双目操作符
!
Int a = 0;
If(a)
{
Printf(“hehe”)
}
If(!a)
{
Printf(“haha”)
}
*p解引用操作符
C语言操作符详解(2)7.10.2021
Sizeof也是单目操作符
Short内存2
~按位取反 灵便成一,一变零
++
--
前置和后置
(强制类型转换)
关系操作符
逻辑操作符
与 &&
或 ||
(看真假)
条件操作符
Exp1 ? exp2:exp3
1真走2,假走3
逗号表达式
下标引用,函数调用,结构成员操作符
[]
()
结构体
Struct stu
{
Char name[20];
Int age;
}
打印%s 字符
结构体,成员变量
整形提升
属性
- 优先级
- 结合性
- 是否控制求值顺序
指针(1)
指针是什么?
指针就是地址
指针类型决定指针接引用访问空间大小。
决定了指针的步长
Char 1
Int 4
Double 8
野指针:指针位置不可知
指针(2)7.12.2021
Int *p;
*p=20;
1.未初始化
2.越界访问
3.空间释放
Int* p = null
指针相减是中间元素个数
指针的关系运算
指针和数组
数组名是首元素地址
1.&arr表示整个地址
2.Sizeof(arr)表示整个数组
一级指针,二级指针。。。。。。
指针数组 存放指针是数组 int*arr2【3】= {&a,&b,&c};
数组指针
作业讲解(1)(2)
(最好再看看)
初始结构体
值的结合,成员变量
结构体关键字 结构体标签
Typedef 命名为stu
结构体成员访问
打印结构体数据
Print1(s);
print2(&s);
结构体传参
实用调试技巧
一切事情都有迹可循
- 发现错误
- 隔离,消除等方法定位
- 确定原因
- 提出方法
- 重新测试
Debug版本的可执行程序 可以调试
release版本的可执行程序 不可调试,带优化
7.13.2021
断点 F9
F10逐过程
F11逐语句
调试的代码没有语法问题
栈区
局部变量,函数参数
堆区
动态内存分配的
静态区
静态变量,全局变量
栈区的使用
1.先使用高地址空间,后用低地址空间(局部变量)
2.数组随着下标增长,地址由低到高变化
#include<assert.h>
Assert();断言
Const 不能改
编译型错误
链接错误(函数未定义)
运行时错误
数据的储存(1)7.15.2021
C语言类型
- 内置类型
整形
Char1
Unsigned char(0——255)
signed char(-128——127)
Short2
unnsigned short
signed short
Int4
Unsigned int
signed int
Long
Unsigned long
signed long
Long long
Float4(单精度浮点型)
Double8(双精度浮点型)
- 自定义类型
构造类型
数组类型
结构体类型
枚举类型
联合类型
指针类型
空类型
Void三个用法
有符号数(整形)有三种表示方法 原码,反码,补码(无符号数三者相同)
一个字节8比特位
原码,用二进制写出来,正数原码,反码,补码相同
负数除符号位取反得反码,反码+1得补码。
整数存放是存放补码
整数
- 有符号数
正数
负数
- 无符号数
大小端介绍(字节序)
大端存储模式:数据的低位保存在内存的高地址中,数据的高位,保存在内存的低地址中。
小端存储模式:数据的低位保存在内存的低地址中,数据的高位,保存在内存的高地址中。
为什么要有大小端
(char*)强制转换
指针类型的意义
访问几个字节,+1向后跳几个
-1补码全1
%d打印十进制有符号数字
%u打印十进制无符号数字
数据的储存(4)
浮点型的储存
%f浮点型能拿出来
(-1)^S*M*2^E
(-1)^S表示符号位
M表示有效数字,大雨等于1,小于2 。
2^E表示指数位
1 8 23
取出分三种情况
E不为全0/1,减去127,得到真实值
E为全0,E为-126
E为全1,无穷大。
指针详解(1)指针的进阶
九个指针
指针4/8个字节
“abcdef”常量字符串
《剑指offer》
指针数组用来存放指针。
Int* parr[4]存放整形指针的数组
Char* parr[4]存放字符指针的数组
指针详解(2)7.17.2021
数组指针:是指针,存放数组的地址,指向数组的指针。
Int(*pa)[5] =&arr
Arr首元素
&arr[0]数组首元素
&arr数组地址
(*p)
二维数组首元素是一列。
数组参数,指针参数
一维数组传参
二维数组传参
指针传参
函数指针:指向函数的指针
&add和add都是函数的地址
Int (*pa)(int,int) =add;
指针详解(4)
(*(void(*)())0)();
()0强制类型转换//调用0地址的函数
C陷阱和缺陷
函数指针的解应用
函数指针数组(转移表)
Int(*parr[10])();
回调函数
指针详解(6)
指针数组
Int* arr[10];
数组指针
Int*(*Pa)[10]=&arr;
函数指针
int(*parr)(int,int)=Add;
函数指针的数组
Int(*parr[5])(int,int)
指向数组指针的指针
Int(*(*pparr)[5])(int,int)
冒泡排序两两相邻的比较
一趟冒泡排序
Qsort 库函数 排序
Void* 无类型指针,可以接受任意类型的地址。
不能加减操作
不能接引用‘
字符串不能直接><=比较。
Qsort(s,sz,sizeof(s[0]),cmp-stu-by-name);
第一个参数中:待排序数组的首元素地址
第二个参数:待排序数组元素个数
第三个参数:待排序数组的每个元素大小 单位是字节
第四个参数:是函数指针,比较两个元素的所用函数的地址(操作者自己实现)
函数指针的两个参数是:待比较的两个元素的地址。
指针详解(8)
一维数组练习
地址大小是4或者8字节
Sizeof求所占空间大小
Strlen是字符串长度