c++ 指针和引用的区别

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++中指针与引用的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值