1.指针和引用的区别
1.指针和引用的区别
csharp
a.指针
是一个"独立的变量, 专门用来存储另一个变量的内存地址; 指针本身占用内存空间, 可指向不同的变量(甚至空地址)"
b.引用
是"某个变量的别名(nickname)和原变量共享同一块内存空间, 没有自己独立的内存", 本质上是编译器层面的"语法糖"
csharp
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;
}
csharp
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;
}
csharp
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 = #
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;
}
csharp
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;
}