3.转义字符
转义字符 | 释义 |
\? | 在书写连续多个问好时使用,防止他们被解析成三字母词 |
\ ' | 用于表示字符常量 ' |
\ " | 用于表示一个字符串内部的双引号 |
\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 禁止符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字,如 : \130 X |
\xdd | dd表示2个十六进制数字,如: \x30 0 |
4.函数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
voidAdd(intx,inty) {
intsum=x+y;
printf("%d\n", sum);
}
intmain() {
intnum1=0;
intnum2=0;
scanf("%d %d", &num1, &num2);
Add(num1,num2);
return0;
}
5.操作符
算数操作符
+ - * / %
移位操作符
>> <<
位操作符
& 按位与
| 按位或
^ 按位异或
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作书的类型长度
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
整数在内存中存储的是补码一个整数的二进制表示有三种:源码、反码、补码
一个数的最高位表示它的符号位
针对负数的
-1:
1000000 00000000 00000000 00000001 (-1源码)
1111111 11111111 11111111 11111110 (-1反码) //补码-1
1111111 11111111 11111111 11111111 (-1补码) //反码+1
正整数
源码 = 反码 = 补码
逻辑操作符
&& ||
条件操作符
a > b ? a : b
逗号表达式
逗号隔开的一串表达式
逗号表达式是从左向右依次计算
整个表达式的结构是最后一个表达式的结果
下标引用、函数调用和结构成员
[] () . ->
常见关键字
autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifint longregisterretrunshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile
C语言提供的关键字
1.C语言提供的,不能自己创建关键字
2.变量名不能是关键字
auto (是自动的 - 每个局部变量都是auto修饰的,默认省略)
{
auto int num = 0;
}
extern (申明外部符号的)
register (寄存器关键字)
int main() {
//大量/频繁被使用的数据,想放在寄存器中,提升效率
register int num = 100; //建议存放到寄存器上,只是建议,编译器说了算
}
signed 有符号的 10 -20
unsigned 无符号的
static静态的
struct 结构体
union 联合体(共用体)
void 无
计算机中的数据可以存储到哪些地方
寄存器 更小
高速缓存 几十MB
内存 8G-16G
硬盘 500G-买的
网盘 2T-免费的
从下往上,空间越小,造价越高,速度越快
**define和include 不是关键字,是预处理指令**
typedef类型重命名
typedef unsigned int u_int
int main() {
unsigned int num = 100;
||
u_int num2 = 100;
}
关键字static
//静态的
1、static 修饰局部变量
static 修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型)
2、static 修饰全局变量
3、static 修饰函数
static 修饰全局变量,是的这个全局变量只能在自己所在的源文件(.c)内部可以使用,其他源文件不能使用
全局变量,在其他源文件内部可以被使用,是因为全局变量具有外部链接属性,但是被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了
static 修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用
本质上:static 是将函数的外部链接属性变成了内部链接属性!(和static 修饰全局变量一样)
voidtest() {
inta=1;
a++;
printf("%d\n",a);
}
intmain() {
inti=0;
while(i<10) {
test();
i++;
}
return0;
}
6.#define 定义常量和宏
define 是一个预处理指令
1.define 定义符号
2.define 定义宏
#define ADD(x,y) x+y
//可以写成
#define ADD(x,y) ((x) + (y))
int main() {
printf("%d\n",ADD(2,3));
//问题
printf("%d\n",4 * ADD(2,3)); //变成了4*2+3
}
三、指针
1、内存
问题
1、内存是怎么编号的?
32位 - 32根地址线 - 物理线 - 通电 - 1/0
带你信号转换成数字信号:1和0组成的二进制序列
00000000 00000000 00000000 00000000
...
01111111 11111111 11111111 11111111
...
10000000 00000000 00000000 00000000
...
11111111 11111111 11111111 11111111
2的23次方个序列
-----------------------------------------------------------------------
2、一个这样的内存单元是多大空间?
2的32次方个内存单元
假设一个内存单位是1bit,就可以管理4,294,967,296个bit位的空间
char 大小是 1 个字节,所以--->
经过平衡,最终一个内存单元给一个字节的大小
4,294,967,296 byte = 4,194,304 KB = 4096 MB = 4GB
拿到变量的地址使用 %p
int a = 10;
printf("%p\n", &a);
int* pa = &a;
*pa = 1002020; // * 解引用操作 *pa 就是通过 pa 里边的地址,找到 a
//pa 是用来存放地址的,在C语言中 pa 叫是指针变量
// * 说明 pa 是指针变量
// int 说明 pa 执行的对象是 int 类型
指针就是地址
2、指针的大小
指针的大小是相同的
在32位电脑上是 4 个字节
在64位电脑上是 8 个字节
为什么
指针是用来存放地址的
指针需要多大空间,取决于地址的存储需要多大空间
32位电脑上是32 bit位的二进制序列 需要4个字节(一个地址是32个bit位,是4个字节)
64位电脑上是64 bit位的二进制序列 需要8个字节(一个地址是64个bit位,是8个字节)
可以理解成指针的大小跟地址线的多少有关,而地址线又跟 32 位或者 64 位平台有关
四、结构体
结构体可以让C语言创建新的类型出来,用来描述复杂对象
structStu {
charname[20];
intage;
doublescore;
};
structBook {
charname[20];
floatprice;
charid[30];
};
intmain() {
structStus= { "张三",20,85.5 }; //结构体的创建和初始化
printf("1:%s %d %.2lf\n", s.name, s.age, s.score); //结构体 变量.成员变量
structStu*ps=&s;
printf("2:%s %d %.2lf\n", (*ps).name, (*ps).age, (*ps).score); //对指针进行解引用操作
printf("3:%s %d %.2lf\n", ps->name,ps->age,ps->score);
return0;
}