CPP 基础
C 语言基础
C 语言关键字
char, short, int, long, float, double, struct, union, enum, void, const, signed, unsigned, sizeof, typedef, auto, static, register, extern, if, else, switch, case, default, for, while, do, break, continue, return
基本数据类型
char, short, int, long, long long, float, double, void, struct, union, enum
等。- 在基本数据类型前加
unsigned
表示无符号类型,最高位不作为符号位,而是数值位。 - 整数默认是
int
,小数默认是double
。所以定义long
类型时最好在数字末尾加l, L
,定义float
类型最好在数字末尾加f, F
基本数据类型 | 字节数 | 范围 |
---|---|---|
char | 1 | -128~127 |
short | 2 | -32768~32767 |
int | 2 或 4 | -231~231-1 |
long | 4 | -231~231-1 |
long long | 8 | -264~264-1 |
float | 4 | – |
double | 8 | – |
变量的存储类型
变量除了有数据类型,还有另外一个重要属性,存储类型。数据类型决定了变量的大小,而存储类型决定了变量的生命周期和可见性。
C 语言中,变量的存储类型有 4 种,auto, static, register, extern
,一般使用的只有前两个。
auto
,默认存储类型。auto 只能用在函数内,修饰局部变量。static
,全局变量默认以 static 修饰。当修饰局部变量时,必须且只能被初始化一次。register
,用于定义存储在寄存器中而不是 RAM 中的局部变量,用于运算要求高的变量。extern
,用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。
算数运算符
+, -, *, /, %, ++, --, <, <=, >, >=, ==, !=, &&, ||, !, &, |, ~, ^, >>, <<, +=, sizeof, ., [], *, (), ?:, 强制类型转换
a^b=c, 则a^c=b, b^c=a
,这一规律广泛运用于密码学。a>>n,相当于a/(2^n)
- 有符号数,右移时最高位补符号位。
- 无符号数,右移时最高位补 0。
a<<n,相当于a*2^n
,最低位直接补 0。
数组与字符串
int a[10]={1, 2, 3}
,前 4 个数分别为 1, 2, 3,后面的数均初始化为 0。- 字符串的末尾必须是
\0
,占一个字节。
指针
变量都存放在从某个内存地址开始的连续的若干个字节中。
- 开始的内存地址:指针。
- 连续的若干字节:指针对应类型的字节长度。
int *p = (int *)1000
,指针指向内存地址为 1000 的位置,管辖后面连续的 4 个字节。
指针变量的大小
指针变量是一种数据类型,它的大小均为sizeof(T *) = 4
,故无论指针变量指向的是何种数据类型,它的大小均为 4 字节。
这是因为当今主流的 CPU 为 32 位,寻址范围是 2^32=4G,所以指针变量只需要 32 位即可。当然对于 64 位 CPU,编译器产生的指针长度也就是sizeof(T *) = 8
。
主机字节顺序
- 大端:低地址存放高位数据,这种最为直观。
- 小端:低地址存放低位数据,在程序,网络中,一般采用的是小端。
例如,将0x1234bacd
以不同的方式存储:
地址 | 大端 | 小端 |
---|---|---|
0x0000 | 12 | cd |
0x0001 | 34 | ba |
0x0002 | ab | 34 |
0x0003 | cd | 12 |
unsigned short a = 0x1234;
char *p = (char *)&a;
for(int i=0;i<2;i++){
printf("%2x\n", *(p+i));
}
如果
short a = 0xf234
,在输出首字节的0xf2
时,会出现fffffff2
而不是f2
,猜测可能是由于printf()
函数在输出时将char
自动转换成了 4 字节的int
造成的,因为%x
对应的就是整型,整型默认是int
。
指针运算
- 同类型的指针可以比较。
- 同类型的指针可以相减。
p2-p1 = (p2-p1)/sizeof(T)
- 指针可以和整型常量相加,相减。
p ± n = p ± n*sizeof(T)
- 指针可以自增,自减。
指针与动态分配内存
- 分配内存:
int *p = new int, int *p = new int[10]
- 释放内存:
delete p, delete[] p
指针类型
- 空指针,也称野指针,未指向任何地址的指针。
p = NUL