1.数据类型(用来创建变量)
字节(内置的数据类型) (自定义数据类型)
(一个汉字占两个字节,不能为char类型,应为char[ ])
char 字符型 1 0 ~ 255 struct 结构体
short 短整型 (short int) 2 0 ~ 65535 enum 枚举类型
int 整型 4 0 ~ 2 ^ 32 -1 union 联合体
long 长整型 (long int) 4
long long 更长整型 8
float 浮点型 4
double 双精度浮点型 8
计算变量或者使用类型创建的变量的大小:
sizeof() 单位:字节
1字节 = 8 bit(最小单位)
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
char字符 ASCII 256种字符 = 8 比特位所表示的二进制的十进制数
1byte = 8bit
1KB = 1024byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
2.变量的分类
在代码块内部定义的变量为局部变量,在代码块外部定义的变量为全局变量
局部变量:
当一个局部变量不初始化的时候,他的值是随机值
全局变量:
全局变量不初始化,默认值为0
(局部变量与全局变量可以同名同时存在,当全局变量与局部变量重名冲突时,局部变量优先)
3.变量的声明周期和作用域
3-1.作用域
局部变量的作用域时变量所在的局部范围。
全局变量的作用域是整个工程。
3-2生命周期(变量的创建到变量的销毁之间的一个时间段)
局部变量的生命周期:进入局部变量所在的范围,生命周期开始,出局部变量所在范围的时候,生命周期结束。
全局变量:整个程序的生命周期。
4.常量
字面常量 (100、3.14、'w'、"abc")
const修饰的常变量(常变量不能被修改,但本质上还是一个变量)
#define定义的标识符常量
枚举常量 enum();
5.数组(初始化可以不指定大小)
一组相同类型元素的集合 (c99中中支持变长数组,允许数组的元素个数用变量来指定)
int arr [ ] = {'A', 'B', 'C'};(数组初始化)
int arr[10] = {0};(数组不完全初始化,会把剩余的元素全部初始化成0)
(括号内应输入常量表达式来指定数组大小)(const修饰的常变量不能使用,因为他本质上还是变量)
数组的每一个元素都有一个下标,下标从0开始(用来访问元素)
6.字符串和转义字符
6 -1字符串放在字符数组中
char arr[] = "ABC"; strlen 的值为3(到\0停止)(没有把\0计算进去)
char arr[] = {'A', 'B', 'C'}; error strlen 的值为15(随机值)(找不到\0往后继续找,直到在内存中找到\0)
char arr[] = {'A', 'B', 'C',' \0'};('\0'是字符串的结束标志)
printf("%s\n", arr);
6-2转义字符 ??) -> ]
\? 在书写连续多个问号时使用防止他们被解析为三字母词 \' 用于表示字符常量 '
\" 表示一个字符串内部的 " \\ 表示一个反斜杠,防止被解释为一个转义字符
\ a警告字符,蜂鸣(响一下) \b 退格符
\f 进纸符 / 换页 \n 换行
\r 回车 \t 水平制表符
\v 垂直制表符 \ddd ddd表示1~3个八进制数字 \130X
\xdd dd表示两个十六进制数字 \x30 0 (\x30 算作一个字符) (\628 \62)
7.操作符
(c语言包含了非常丰富的操作符,甚至可以操作内存的数据,可以直接操作二进制位)
算数操作符
+ - * / %
/(两端都是整数执行整数除法,结果取整。只要出号两端有一个数是小数,执行高精度除法,结果为浮点型)
% (n % 2 可以判断奇数偶数)
移位操作符
<< / >>(二进制位左移或右移一位)
位操作符
& 按位与 (对应的二进制位同为1才为1,否则为0)
|按位或 (对应的二进制位同为0才为0,否则为1)
^按位异或(对应的二进制位相同为0,相异为1)
赋值操作符
赋值
=
复合赋值
-=
+= ......
单目操作符 (只有一个操作数)
! 逻辑反操作(c语言中0表示为假,非0表示为真)
- + 正负值
& 取地址
sizeof 操作数的类型长度(以字节为单位)(不是函数而是操作符)
(计算的是变量或者类型所创建变量占据内存的大小--单位是字节)
~ 对一个数的二进制位按位取反
(负整数的二进制有原码、反码、补码,内存中存储的是补码)
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
>
>=
!= 用于测试"不相等"
== 用于测试"相等"
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
(exp1 ? exp2 : exp3)
逗号表达式
(exp1, exp2, exp3.....expN (从左向右依次计算,整个表达式的结果是最后一个表达式的结果)
下标引用、函数调用和结构成员
[ ] 下标引用操作符
( ) 函数调用操作符
int sum = Add(3, 5);
. 结构体成员引用
-> 结构体指针成员引用
8.关键字(define不是关键字 是 预处理指令)
Break case char const continue defualt do double else num
float for goto if int long return short sizeof static
switch typedef void Volatile while
· Auto 自动 auto int a; 所有的局部变量都是自动变量 (自动创建自动回收)
·const 修饰变量,修饰指针(定义常变量)
·default 默认 / 缺省
· Register 寄存器变量(不能取地址),访问速度更快(建议作用)
寄存器(eax,ebx,ecx,edx,esp,ebp) 越往上速度越快,造价越高,空间越小 |
高速缓存 CPU(中央处理器) |
内存 8/6G |
硬盘 500G |
网盘 2T |
·(Signed)【省略】 变量 = 有符号数字
· Unsigned 变量 = 无符号数字
· Struct 结构体关键字
· union 联合体/共用体
· Typedef 类型定义 类型重定义(类型重命名)
· static 静态变量 修饰局部变量(改变了变量的类型) 使局部变量生命周期变长
(栈区存储 ->静态区存储)从而使得静态的局部变量出了自己的作用域也不会销毁
修饰全局变量 让静态的全局变量只能在自己所在的源文件中使用
修饰函数改变了函数的链接属性 (外部链接属性是指一个变量或函数在这个源文件定义,可以在其他源文件使用)
外部链接属性 = > 内部链接属性 (作用域变小了,声明周期不变) 需要搭配extern
· extern 声明外部符号 全局变量、全局函数可在其他源文件使用
9.注释
//
/*
/* (有缺陷不支持嵌套)
*/ 1 3 号会相互匹配 导致四号被无视了
*/ 3 4号之间的代码不会被注释掉
10.选择和循环语句语句
10-1.选择语句
if语句
switch语句
10-2.循环语句
for 语句
while语句
do while语句
内存
是一块比较大的存储空间
在使用时会划分出不同的功能区域
栈区域 存放局部变量 |
堆区 动态内存分配 malloc free calloc realloc |
静态区 全局变量 静态变量 |
11.函数(定义如果在调用之后定义,要先声明)
main函数(主函数)
那么什么是函数呢
类比数学中的函数
f(x) = x + 1
这个函数具有求和的功能
C语言中把一些独立的功能也能够封装一个个的独立的函数
把函数想象成一个工厂
给他输入原材料
原材料在工厂中被加工(进行函数运算)成成品(返回结果)
12.#define 定义宏
#define ADD(X, Y) ((X) + (Y)) 定义宏不要吝啬括号,由于时替换属性容易出错
int a = 10;
int b = 20
int ret =ADD(a, b);
ret = 30;
13.内存(%p打印地址)
计算机程序的运行都是在内存中进行的
内存 | 内存单元地址 |
一个内存单元 | 0xFFFFFFFF |
一个字节 | 0XFFFFFFFE |
一个字节 | |
一个字节 | |
一个字节 |
14.指针(地址也称为指针)
地址存到变量 那么这个变量也称为指针变量
指针变量用来存放地址
int a = 10;
printf("%p\n", &a);
int* p = &a;(取地址取的是第一个字节的地址,取低地址)
(int 说明p时指向一个整型变量的,*时告诉我们p时指针变量)
*p(解引用操作符)(间接访问操作符)
通过p存放的地址,找到地址所指向的对象
指针变量有多大?------>地址的存放需要多大的空间?------>地址是如何产生的?地址是什么样的数据?
4byte 4byte(32个bit)
早期16位机器
当前32位、64位
32位 机器 —————> 32根地址线/数据线 ----> 2 ^ 32 个地址(32个0/1的组合数)
物理电线 - 通电 ->高电频率和低电频(1/0)
产生2 ^32个(地址个数)二进制序列作为内存编号 ----> 需要4个字节(byte)进行存储
000000000000000000000000000000000000
000000000000000000000000000000000001
000000000000000000000000000000000010
000000000000000000000000000000000011......
64位 机器 —————> 64根地址线 ---->2 ^ 64 个地址(64个0/1的组合数)
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000001
000000000000000000000000000000000000000000000000000000000000000000000010
000000000000000000000000000000000000000000000000000000000000000000000011......
每个地址占64bit --> 8byte
VS2019
x86 是32位程序
管理4,294,967,296个byte空间 -->4个G
x64 是64位程序
管理4* 2 ^ 32 G的空间
15.结构体
复杂对象
//结构体类型的定义
struct Stu
{
//结构体成员
char name[20]; // 数组类型没有初始化,数组大小一定要定义
int age;
char sex[10];
};
int main()
{
//创建结构体变量并初始化再进行使用
struct Stu zhangsan = {"张三", 20, "男"};
struct Stu lisi = {"李四", 24, "男"};
printf("%s %d %s\n", zhangsan.name, zhangsan.age, zhangsan.sex);
//通过指针访问结构体变量
struct Stu* p1 = &lisi;
printf("%s, %d, %s", (*p1).name, (*p1).age, (*p1).sex);
printf("%s, %d, %s", p1->name, p1->age, p1->sex);
}
. 结构体成员访问操作符
结构体变量.结构体成员
->结构体成员访问操作符
结构体指针->结构体成员