c++引用和指针

using namespace std; 的含义

在 C++ 中,using namespace std; 语句的作用是告诉编译器使用 std 命名空间中的所有名称,这样在代码中就可以直接使用这些名称,而不需要在前面加上 std::。例如,使用 cout 而不是 std::cout

是否每个 .cpp 文件都要写?

不需要在每个 .cpp 文件中都写 using namespace std;。虽然它可以让代码更简洁,但在大型项目中,使用 using namespace std; 可能会导致命名冲突。因此,许多开发者倾向于在需要使用 std 命名空间中的特定名称时,直接使用 std:: 前缀。这样可以提高代码的可读性和维护性。

C++ 中的引用和指针

1. 指针
  • 定义:指针是一个变量,用于存储另一个变量的内存地址。

  • 语法

    int* ptr; // 声明一个指向整数的指针
    
  • 使用

    int a = 5;
    int* ptr = &a; // ptr 现在指向 a 的地址
    *ptr = 10;     // 通过指针修改 a 的值
    
  • 特点

    • 指针可以指向空值(nullptr)。
    • 指针可以改变指向,指向其他变量。
    • 可以使用算术运算符进行地址运算。
2. 引用
  • 定义:引用是一个变量的别名,用于直接访问该变量。引用一旦绑定到一个变量,就不能更改绑定。

  • 语法

    int& ref = a; // 声明一个引用,引用 a
    
  • 使用

    int a = 5;
    int& ref = a; // ref 是 a 的引用
    ref = 10;     // 通过引用修改 a 的值
    
  • 特点

    • 引用必须在定义时初始化,不能不初始化。
    • 引用不能指向空值(不可以有空引用)。
    • 一旦引用绑定到一个变量,就不能再改变其引用的对象。

引用与指针的区别

特点指针引用
初始化不必初始化,可以指向空值必须初始化,不能指向空值
改变引用可以改变所指向的对象不能改变所引用的对象
语法使用 * 访问和修改使用变量名直接访问和修改
空值处理可以指向 nullptr不允许有空引用
使用场景需要动态内存分配或数组操作更加简洁和安全的语法

示例代码

#include <iostream>
using namespace std;

void modifyWithPointer(int* p) {
    if (p != nullptr) {
        *p += 10; // 通过指针修改值
    }
}

void modifyWithReference(int& ref) {
    ref += 10; // 通过引用修改值
}

int main() {
    int a = 5;
    
    // 使用指针
    int* ptr = &a; // 指针指向 a
    modifyWithPointer(ptr);
    cout << "Value of a after pointer modification: " << a << endl; // 输出 15

    // 使用引用
    int& ref = a; // 引用 a
    modifyWithReference(ref);
    cout << "Value of a after reference modification: " << a << endl; // 输出 25

    return 0;
}

总结

  • 指针适用于需要动态分配内存、处理数组或需要改变指向的情况。
  • 引用更简洁,适用于函数参数传递、简化代码和增强可读性。
#include <iostream>
using namespace std;

// 函数演示:通过指针和引用修改变量
void modifyWithPointer(int* p) {
    if (p) { // 检查指针是否为null
        *p += 10;
    }
}

void modifyWithReference(int& ref) {
    ref += 10;
}

int main() {
    int a = 5;

    // 1) 引用必须被初始化,指针可以不初始化
    int* ptr;             // 未初始化的指针
    int& ref = a;         // 引用必须在定义时初始化,且不能更改
    ptr = &a;             // 指针可以随时指向某个变量

    // 输出初始值
    cout << "Initial value of a: " << a << endl;

    // 2) 引用初始化后不能改变,而指针可以改变所指对象
    int b = 20;
    ptr = &b;             // 指针可以指向新的对象
    // ref = b;           // 错误:引用不能重新绑定到另一个变量

    // 通过指针和引用修改变量
    modifyWithPointer(ptr); // b += 10;
    cout << "Value of b after modifyWithPointer: " << b << endl;

    modifyWithReference(ref); // a += 10;
    cout << "Value of a after modifyWithReference: " << a << endl;

    // 3) 指针可以为空,而引用不能指向空值
    ptr = nullptr;         // 指针可以指向空值
    // int& invalidRef;    // 错误:引用必须初始化且不能为空

    // 常见使用场景:流操作符和赋值操作符返回引用
    cout << "Stream operators << and >> return a reference:" << endl;
    cout << a << endl;

    // 引用在赋值操作符重载中
    int x = 100;
    int y = 200;
    // cout << "address of x: " << &x << endl;
    // cout << "address of y: " << &y << endl;
    y = x;                // 赋值操作符使用值传递

    cout << "Value of y after assignment: " << y << endl;
    // cout << "address of x: " << &x << endl;
    // cout << "address of y: " << &y << endl;

    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值