1.可寻址的最小内存块称为“字节(byte)”
2. 存储的基本单元称为“字(word)”
1byte = 8 bits;
4byte = 32 bits = 1 word;
算数类型:
- 算数类型分为两类: 整型(integral type 包括字符和布尔类型在内)和 浮点型;
- 带符号类型和无符号类型:signed, unsigned;带符号类型可表示正数,负数,0。
无符号类型则仅能 表示大于等于0 的值;
如何选择类型:
- 当明确知晓数值不可能为负时,选用无符号类型;
- 使用int执行整数运算;
- 在算术表达式中不要使用bool或char;
- 执行浮点数运算选用double;
当我们给无符号类型(unsigned)一个超出它表示范围的值时。结果是初始值对无符号类型表示数值总数取模后的余数;
当我们给带符号类型(signed)一个超出它表示范围的值时,结果是未定义的;
初始化 不等于 赋值!!!
———————————————————————————————————————————
2.3复合类型
引用和指针
2.3.1reference引用
引用即别名,引用的初始值必须是对象
int &refVal4 = 10; //错误: 引用类型的初始值必须是一个对象
2.3.2pointer指针
指针是指向另外一种类型的复合类型,实现了对其他对象的间接访问。指针本身就是对象,允许对指针赋值和拷贝,可以先后指向不同的对象。指针无须在定义时赋初值。
和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。
double dp, *dp2; //dp2 是指向double型对象的指针,dp是double型对象
获取对象的地址
指针存放某个对象的地址。想要获取该地址,需要使用取地址符&:
int ival = 42;
int *p = &ival; //p存放变量ival的地址,或者说p是指向变量ival的指针
*引用不是对象,没有实际地址,所以不能定义指向引用的指针。
double dval;
double *pd = &dval; //初始值是double型对象的地址
double *pd2 = pd; //初始值是指向double对象的指针
//指针pd指向变量dval,其本身存储的值是dval的地址,所以用pd去初始化指针pd2,就是用dval的地址去初始化pd2,所以pd2指向的也是dval,而pd2本身的值,也是val的地址
指针值
指针的值(也就是地址)应属于下列4种状态之一
- 指向一个对象;
- 指向紧邻对象所占空间的下一个位置;
- 空指针,意味着指着没有指向任何对象;
- 无效指针,也就是上述情况之外的其他值;
利用指针访问对象
如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问该对象
int ival = 42'
int *p = &ival; //p存放着变量ival的地址,或者说p是指向变量ival的指针
cout << *p; //由符号*得到指针p所指的对象,输出42
*p = 0 //由符号*得到指针P所指的对象,即可经由p为变量ival赋值
cout << *p; //输出0
空指针
不指向任何对象
int* p1 = nullptr;
int* p2 = 0;
!初始化所有指针!
赋值和指针
给指针赋值就是令它存放一个新的地址,从而指向一个新的对象;
指针声明符:*
解引用符:* 读地址里面的信息
取地址符:& 地址
int i = 42;
int *pi = 0; //pi被初始化,但没有指向任何对象
int *pi2 = &i; //pi2被初始化,存有i 的地址
int *pi3; //如果pi3定义于块内,则pi3的值是无法确定的
pi3 = pi2; //pi3和pi2指向同一对象
pi2 = 0; //现在pi2不指向任何对象了
void* 指针
可以用于存放任意对象的地址。
我们对该地址中到底是个什么类型的对象并不了解。
以void*的视角来看内存空间也就仅仅是内存空间,没办法访问内存空间中所存的对象
//错误示例:
int i = 0;
int *ip = i; // 不能直接把int变量赋给int指针,正确的做法是
//通过取地址运算&i得到变量i的内存中的地址,然后再将该地址赋给指针。
int *p = &i; //正确方式