1.指针和引用的区别
1.指针和引用的区别
a.指针 是一个"独立的变量, 专门用来存储另一个变量的内存地址; 指针本身占用内存空间, 可指向不同的变量(甚至空地址)"b.引用 是"某个变量的别名(nickname)和原变量共享同一块内存空间, 没有自己独立的内存",本质上是编译器层面的"语法糖"
a.初始化差异#include <iostream>usingnamespacestd;intmain(){inta=10;// 指针:可未初始化(不推荐,野指针)int*p1;// 合法,但p1指向随机地址(野指针,危险)int*p2=&a;// 正确初始化// 引用:必须初始化,否则编译报错// int& ref1; // 错误:引用必须初始化int&ref2=a;// 正确:ref2是a的别名return0;}
b.指向/绑定修改差异#include <iostream>usingnamespacestd;intmain(){inta=10,b=20;// 指针:可修改指向int*p=&a;cout<<*p<<endl;// 输出:10p=&b;// 指针指向bcout<<*p<<endl;// 输出:20// 引用:不能修改绑定对象(看似修改,实际是修改原变量)int&ref=a;cout<<ref<<endl;// 输出:10ref=b;// 不是绑定b,而是把b的值赋给a(a变成20)cout<<a<<endl;// 输出:20cout<<ref<<endl;// 输出:20(ref还是a的别名)return0;}
c.空值与语法使用差异#include <iostream>usingnamespacestd;intmain(){// 指针:可空int*p=nullptr;// 空指针,合法if(p==nullptr){cout<<"p是空指针"<<endl;}// 引用:不能空(以下代码编译报错)// int& ref = nullptr; // 错误:引用必须绑定到有效变量// 语法使用:指针需要解引用,引用直接用intnum=100;int*p_num=#int&ref_num=num;cout<<*p_num<<endl;// 指针:解引用访问值,输出100cout<<ref_num<<endl;// 引用:直接访问值,输出100cout<<&p_num<<endl;// 指针自身的地址(独立内存)cout<<&ref_num<<endl;// 引用的地址 = 原变量num的地址(无独立内存)return0;}
d.const修饰的差异#include <iostream>usingnamespacestd;intmain(){intx=5,y=6;// const修饰指针:两种场景constint*p1=&x;// 指向的内容不可改,指针本身可改// *p1 = 10; // 错误p1=&y;// 正确int*constp2=&x;// 指针本身不可改,指向的内容可改*p2=10;// 正确// p2 = &y; // 错误// const修饰引用:限制引用的内容不可改constint&ref=x;// ref = 10; // 错误:不能修改const引用的内容x=10;// 正确:原变量可改,引用值也会变cout<<ref<<endl;// 输出:10return0;}