确定内存地址的数据需要数据类型和读取内存地址的二进制数据,不同的数据类型决定了占用多少比特以及如何解析这些内存数据。
上述的int、long、long long类型都是有符号数,对应的无符号数前面加上unsigned。
数据类型的后缀中是U时,字面量是unsigned类型,类型可以使unsigned int,unsigned long或unsigned long long 类型;
如果后缀是L,字面量类型时long;
如果后缀是LL,字面量类型时long long 或者unsigned long long
如果后缀是UL或ULL,字面量类型时unsigned long或unsigned long long
前缀类型表:
Meaning Prefix Typeu Unicode 16 character Char16_t
U Unicode 32 character char32_t
L wide character wchar_t
u8 utf-8 char
初始化和定义
C++提供了多种初始化的方式:
int unit = 0;
int unit = {0};
int unit{0};//列表初始化
int unit(0);
编译器不允许使用列表初始化时类型信息丢失:
long double ld = 3.1415926 Declaration & Definition
声明:声明一个名称让程序知道
定义:定义除了声明名称和类型,同时申请内存和提供默认值
为了得到一个变量的声明而不是定义,我们使用extern关键字,而且不显示的初始化变量。
extern int i; // 声明变量int j; // 定义变量
一个变量可以被声明多次,但是只能被定义一次。
作用域全局作用域:定义在函数体之外的变量
块作用域:{}内的作用域
复合类型C++中有多种复合类型,这里记录指针和引用。
引用为对象起了另外一个名字,通过&d来定义引用类型,其中d是变量名
int a = 1;
int &d = a; // 声明引用,d是a的另外一个名字
int &d2; // 报错,引用必须初始化
引用非对象,相反的,它是为对象取了一个别名
为引用赋值,实际是赋值给引用的对象;获取引用的值,获取的是对象的值;将引用的值作为初始值,实际上是将引用对象的值作为初始值。
因为引用本身不是对象,所以不能定义引用的引用。
无法将引用绑定到另外一个对象,因此引用必须初始化。
可以给引用赋值(等于给别名赋值),如下代码所示:
int i = 0;int &ri = i;
ri = 10; // legal,这里等于是给i进行赋值
指针
指针时一个指向其他类型的复合类型,值是指向对象的地址。
指针本身是一个对象。
指针值
指针的值可以指向一个对象
可以指向刚刚读取完的对象的值(类似于Iterator执行的对象)
可以是个空指针,即没有绑定任务对象
invalid指针,除了上述三种指针的值都是不合法的。
指针的指针
可以使用**p获取指针的指针所在对象的值。
void*
void*是一个特别的指针类型,可以保存任意对象的地址
在理解类似于 *&p这种类型的时候,将修饰符从右往左读去理解。
const修饰符