#include <iostream>
int main() {
//复合类型compound type:指基于其他类型定义的类型,如引用和指针
//声明语句;由一个基本数据类型base type 和紧随其后的一个 声明符declarator 列表组成
//引用reference :为对象起了另外一个名字,引用类型引用refers to 另外一种类型。
//通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名
int ival = 1024;
int &refVal = ival; //refVal指向ival (是ival的另一个名字)
//int& refVal2; //报错:引用必须被初始化
std::cout << refVal << '\n';
/***引用:程序把引用和它的初始值绑定bind在一起,而不是拷贝*****/
//一旦初始化完成,引用将和它的初始值对象一直绑定在一起,所以必须初始化
refVal = 2;
int ii = refVal;
std::cout << ival << '\n'; //为引用赋值实际上把值赋给了引用绑定的对象
int& refVal3 = refVal;
int i = refVal;
std::cout << refVal3 << '\n' << i << '\n';
int i1 = 1024, i2 = 2048;
int &r = i1, r2 = i2;
int i3 = 1024, & ri = i3;
int& r3 = i3, & r4 = i2;
r4 += r3;
r = r + r4;
std::cout << i2 << '\n'<<i1<<'\n';
//引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起
//int& refVal4 = 10; //引用类型的初始值必须是一个对象
double dval = 3.14;
//int& refVal5 = dval; //该引用类型的初始值必须是int型对象
//指针pointer 是 指向 point to 另外一种类型的复合类型
//指针本身就是一个对象,允许对指针赋值和拷贝,且在生命周期内可以先后指向几个不同对象
//指针无需在定义时赋初值
//定义指针 *d ,其中的是变量名
//如果在一条语句中定义了几个指针变量,每个变量前面都必须有符号*
int *ip1, *ip2;
double dp, *dp2;
//指针存放某个对象的地址,想要获取该地址需要使用取地址符&
//&取地址&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
int ival1 = 42;
int *p = &ival1;