一、数据类型
1.基本内置类型
1-1 整型
short
int
long
sizeof(long)
32位:4字节
64位:8字节
long long
1-2 浮点型
float
double
1-3 字符型
char
2. 类型基本归类
2-1 整型家族
char
本质ASCII值是整型
short
int
long
long long
需要正负号的用signed
不需要正负号的用unsigned
2-2 浮点型家族(表示小数)
float
double
2-3 构造类型(自定义类型)
数组
结构体struct
枚举enum
联合union
2-4 指针类型
2-5 空类型
void test(void)
第一个void:函数没有返回值
括号里的void:函数不需要传任何参数
3. 整型在内存中的存储
以二进制的补码形式进行存储
3-1 整数的二进制的3种表现形式
原码
反码
补码
3-2 正整数、负整数的原码、反码、补码
3-2-1 正整数
原码、反码、补码相同
3-2-2 负整数
原码
通过二进制写出(最高位0正1负)
反码
符号位不变
其他位取反
补码
反码+1
3-2-3 在内存中为什么使用二进制的补码形式进行存储
将符号位和数值域统一处理
加法和减法统一处理(CPU只有加法器)
补码和原码相互转换,运算过程是相同的,不需要额外的硬件电路
3-3 大小端介绍
大端字节序存储:11 22 33 44
高位序字节内容放在低地址处
低位序字节内容放在低地址处
小端字节序存储:44 33 22 11
高位序字节内容放在高地址处
低位序字节内容放在低地址处
4. 浮点型在内存中的存储
4-1 规则
(-1)^S * M * 2^E
(-1)^S :符号位
M:有效数字,大于等于1,小于2
2^E:指数位
-5.0f-->101(二进制)-->1.01 * 2^2【^2:向左移两位】(科学计数法)
1.01 * 2^2-->(-1)^0 * 1.01 * 2^2
S = 0
M = 1.01
E = 2
4-2 指数E从内存中取出(3种情况)
E不为:全0/全1
E全为:0
E全为:1
5. 指针数组
数组
存放指针的数组
int* arr[10]; //存放整型指针的数组
6. 数组指针
指针
指向数组的指针
int* p1[10]; //p1是指针数组
int (*p2)[10]; //p2是数组指针 //p2可以指向一个数组
整型指针用来存放整型的地址
字符指针用来存放字符的地址
数组指针用来存放数组的地址
7. 数组名
数组名通常表示数组元素地址,但是有2个例外
7-1 sizeof(数组名):表示整个数组,计算数组的大小
7-2 &数组名:取出整个数组的地址,这里的数组名还是表示整个数组
arr作为数组名
表示数组首元素地址
表示二维数组的首元素地址是第一行地址
int arr1[2]; //数组
int *parr1[2]; //指针数组
int (*parr2)[2]; //数组指针
int (*parr3[2])[3]; //存放数组指针的数组
2个元素,每个元素是一个指针
每个指针指向一个数组
每个数组存放3个元素
8.数组参数、指针参数
8-1 一维数组传参
void test(int arr[10])
void test(int arr[]) //可以写成数组
void test(int *arr) //可以写成指针
void test(int *arr[10])
void test(int **arr)
8-2 二维数组传参
void test(int arr[3][2])
void test(int arr[][]) //这种写法不行!!! //形参的二维数组,行可以省略,列不能省略
void test(int arr[ ][4])
void test(int (*arr)[5])
8-3 一级指针传参
void print(int* p)
print(&a)
print(ptr)
print(arr)
8-4 二级指针传参
void test(int** ptr)
test(pp)
test(&p)
8-5 函数指针
类比数组指针
指向数组的指针
函数指针
指向函数的指针
&函数名、函数名
对于函数来说,&函数名、函数名都是函数的地址
printf("%p\n",&函数名):
printf("%p\n",函数名):