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