c++ 指针和引用的区别
1. & 和 * 符号的含义
#include <iostream>
using namespace std;
int main(){
int a = 10;
int* p; // int* 表示整型指针; *声明的时候表示指针
p = &a; // &a 表示取a的地址; &使用的时候表示取地址
// 以上代码也可以写成下面的形式: 定义指针的同时赋初值
int* p1 = &a;
cout << "*p: " << *p << endl; // *使用的时候表示取值
cout << "*p1: " << *p1 << endl;
// -----------------分界线---------------------------
int b = 100;
int &ref = b; // &声明的时候表示引用;给变量b取别名
cout << "ref: " << ref << endl;
cout << "b: " << b << endl;
ref = 1000;
cout << "ref: " << ref << endl; // ref改变,b也会改变,因为它们指向同一个地址
cout << "b: " << b << endl;
}
总结: *号: 声明的时候表示指针,使用的时候表示 取值;
&号:声明的时候表示引用,使用的时候表示 取地址;
2. 指针和引用的区别
指针 是一个变量,存储的是一个地址,指向内存的一个存储单元;
引用 是原变量的一个别名,跟原来的变量实质上是同一个东西。
// 区别1:指针可以有多级,引用只能是一级
int **p; // 合法
int &&a; // 不合法
// 区别2: 指针可以在定义的时候不初始化,引用必须在定义的时候初始化
int *p; // 合法
int &ref; // 不合法
int b = 100;
int &ref = b; // 合法
// 区别3: 指针可以指向NULL,引用不可以为NULL
int *p = NULL; // 合法
int &ref = NULL; // 不合法
// 区别4:指针初始化之后可以再改变,引用不可以
int a = 10;
int *p = &a; // 初始化, p 是 a 的地址
int &ref = a; // 初始化, ref 是 a 的引用
int b = 100;
p = &b; // 合法, p 更改为 b 的地址
ref = b; // 不合法, ref 不可以再改变
// 区别5:sizeof 的运算结果不同
int a = 10;
int *p = &a;
int &ref = a;
// 返回 int* 类型的大小,其实不管是int*、float*、double*、char*,只要是指针,在计算机中需要的内存大小是固定的, 64位机器需要 8个字节,32位机器需要4个字节
cout << sizeof(p);
// 返回 int 类型的大小, ref 其实就是a,是一个int类型
cout << sizeof(ref);
// 区别6:自增运算意义不同
int a = 10;
int *p = &a; // 假如a的地址为0x0008
int &ref = a;
p++; // 指向a后面的地址,此时p指向 0x000c, 增加了4个字节(32位操作系统)
ref++; // 相当于a++, ref变为11, a也变为11
// 区别7:指针和引用作为函数参数时,指针需要检查是否为空,引用不需要
// 指针和引用都可以作为函数参数,改变实参的值。
void fun_p(int *p)
{
// 需要检查P是否为空
if (p == NULL)
{
// do something
}
}
void fun_r(int &r)
{
// 不需要检查r
// do something
}
参考:C++中指针与引用的区别