给一个变量定义一个引用

int main()
{

int a = 666;
// int&表示定义一个int类型的引用
int& ra = a;
// 引用必须初始化,下面rb这个就是错误的写法
//int& rb;
ra = 777;
std::cout << a << std::endl;
}

也可以给一个变量定义多个引用

int a = 666;
// ra和rb都是变量a的引用,都可以用来操作a的值
int& ra = a;
int& rb = a;
rb = 888;
std::cout << a << std::endl;

引用的地址与指针完全相同

int a = 666;
int& ra = a;
int& rb = a;
// 下面三行打印出来的完全一样
std::cout << &a << std::endl;
std::cout << &ra << std::endl;
std::cout << &rb << std::endl;

简单的一个用法,后续还有其他用法

int main()
{
int a[3]{ 1,2,3 };
// 因为i是局部变量,所以i不可能改变数组a里的值
for (int i:a) {
i = i + 1;
}
for (int i : a) {
std::cout << i << std::endl;
}
std::cout <<"---------------" << std::endl;
// 获取i的引用,然后能改变i所对应的内存里的值
for (int& i : a) {
i = i + 1;
}
for (int i : a) {
std::cout << i << std::endl;
}
}

从上述例子来看,似乎引用和指针区别不大,下面代码展现了指针和引用的区别

typedef struct person {
int a;
}*p,&b;
int main()
{
person ps;
p zhizhenP= &ps;
zhizhenP->a = 666;//指针使用推导符号
std::cout << ps.a << std::endl;
b yinyongB = ps;
yinyongB.a = 777;//引用直接就能点出来
std::cout << ps.a << std::endl;
}

还有一个区别就是指针可以无限指针下去,而引用就不行,比如指针的指针,指针的指针的指针,而不能引用的引用

person ps;
p zhizhenP= &ps;
person** aa = &zhizhenP;//aa是指针的指针

b yinyongB = ps;
//person&& bb = yinyongB;我想表达引用的引用,但是这种写法是错误的

下面的例子展示了与java引用完全不一样的地方

int a = 66;
int& ra = a;
int b = 77;
// 这句话的意思是将b的值77给a
// 千万不要认为这是把b的引用给ra
ra = b;
std::cout << a << std::endl;
std::cout << b << std::endl;

引用只要被定义,则以后就无法在修改,就是说ra就是a的引用,它不会再是别人的引用