c++ 指针和引用的区别

本文详细介绍了C++中的指针和引用,包括它们的声明与使用,以及两者之间的主要区别。指针是一个变量,存储的是内存地址,而引用是变量的别名,二者绑定后不可更改。指针可以为空,引用则不能为空;指针可以多级,引用仅有一级。在函数参数传递中,指针需要检查是否为空,引用则不需要。此外,指针和引用在自增运算上的意义也不同。通过对这些概念的深入理解,开发者可以更好地掌握C++编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值