第二章:变量与基本类型
基本内置类型
C++的基本内置类型包括了:算术类型(字符、整型、布尔、浮点等)和空类型(void)。
他们的机器实现:
首先理解三个概念
· 比特(bit):又叫位,计算机以比特序列存储数据,它的值非0即1。
· 字节(byte):是可寻址的最小内存块,占8位比特,其与一个char的大小相同。
· 字(word):储存的基本单位,大小为4或8个字节。
下表为不同算术类型在不同机器上的所占大小。
算术类型 | 32位机(单位:字节) | 64位机(单位:字节) |
---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 4 | 8 |
long long | 8 | 8 |
float | 4 | 4 |
double | 8 | 8 |
* | 4 | 8 |
对于整形而言,其取值范围是:如果无符号[0, 2(n*8)-1];如果有符号[-2(n*8-1), 2(n*8-1)-1]。(n为字节数)。
在类型转换时,有几点需要注意,见以下代码:
bool b = 100; //b的值为true(非0均为true,0为false)
int i = b; //i的值为1(bool类型true为1,false为0)
i = 3.77; //i的值为3(采用舍弃小数点后的方法)
double d = i; //d的值为3.0(自动补上小数点后的值)
unsigned char c = -1; //c的值为255(负数转换为无符号)
转义序列一般以\
开头,常见的有\\; \t; \n
等,或者\加1至3位八进制的数字\115
(表示字母M),还可以\x后加1至n个十六进制的数\x4d
(也表示字母M)。
std::cout<<"\115\x4d!" \\输出MM!
变量
变量是一个具名的可被程序操作的储存空间,在C++中,变量可与对象互换使用。
初始化
· 对象在创建时获得一个特定的值,这个对象就被初始化了。
· 初始化与赋值不同,初始化是创建变量时赋予一个初始值;赋值则是把对象当前值擦除掉以一个新值替换。
· 方式int i = 0; int i(0); int i{0}
这三种都可以,最后一种为列表初始化,其在有丢失信息风险 时会报错,例如int i{1.1}
声明与定义
· 声明:使名字为程序所知,规定了变量的类型与名字。需要关键字extern且不得显示初始化。extern int i;
· 定义:创建与名字关联的实体,其包含变量的名字、类型、并且在这里会申请储存空间。int i; int j = 1; extern int k = 1
· 一个变量可被声明多次,但其只能被定义一次。
作用域
每个变量都有作用范围,其始于变量的声明语句,结束语作用域末端。
在作用域嵌套时,内部作用域的变量会覆盖外部作用域的同名变量。
复合类型
这里的复合类型只讲了引用和指针两种
引用(reference)
· 引用不是对象,它只是为已存在的对象起的另外的名字
· 引用只可以绑定在对象上,故没有引用的引用,同时对引用的所有操作都是在绑定的对象上进行的。
int i = 10;
int &r = i; //定义一个引用r
int &r1; //err:引用必须初始化
r = 1; //等价于 i = 1;
指针(pointer)
· 指针是一个对象,它的值是其它对象的地址。
int *p; //定义一个指针p
int i = 10;
int *p1 = &i; //定义一个指针p1并把i的地址赋值给p1
double *p2 = &i;//err:类型不匹配
由于指针是一个对象,故存在指向指针的指针与指针的引用。
引用不是对象,所以一旦定义无法改变,与其访问的对象绑定了。
指针是对象,它可以随意改变,可以改变地址,也可以改变地址里存的值。
int i = 10;
int *p = &i; //p为i的指针,p的值是i的地址
int** pp = &p; //pp是p的指针,即指针的指针,故pp的值是p的地址,对pp两次解引用可以获取i,即**pp==i
int*& r = p; //r是一个指针的引用,故对r的操作就是对p的操作
//如何辨别是指针的引用,从右向左阅读先读到&证明是引用,而后证明是int类型指针的引用
操作符
在指针和引用这里频繁的出现&*这两个操作符,他们的具体含义如下
· &:在等号左边的时候,他表示一个引用int &r = i
,在等号右边的时候,它表示取地址int *p1=&i
· *:在类型名后边用于声明一个指针int *p1, p2, *p3;//p1 p3是指针,p2不是
,在表达式中表明取值(解引用)*p1 = 10
简单来说,除了定义引用与指针,*表示取值,&表示取址。
空指针
空指针不指向任何对象,用nullptr
表示。
· 在所有指针声明时尽量初始化他们,否则可能会出现运行错误而且极难排查。