
🔥个人主页:@草莓熊Lotso 🎬作者简介:C++研发方向学习者 📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言:通过前面的学习,我们会发现指针和引用是两个强大而又容易混淆的概念。它们都提供了间接访问变量的方式,但在语法和语义上存在重要差异,所以博主在这里想给大家详细讲解一下指针和引用的使用,特点以及对比分析。
指针:指针是一个变量,其值为另一个变量的内存地址。我们可以通过指针来间接访问和修改它所指向的变量的值。
int main() {
    int x = 10;
    int* ptr = &x;  // 指针ptr指向x的地址
    
    cout << "x的值: " << x << endl;       // 直接访问x
    cout << "x的地址: " << &x << endl;    // 输出x的地址
    cout << "ptr的值: " << ptr << endl;   // 输出ptr存储的地址(即x的地址)
    cout << "ptr指向的值: " << *ptr << endl;  // 通过指针访问x的值
    
    *ptr = 20;  // 通过指针修改x的值
    cout << "修改后x的值: " << x << endl;
    
    return 0;
}引用:引用是已存在变量的别名,它与被引用的变量共享同一内存地址。引用一旦初始化后,就不能再指向其他变量。
int main() {
    int x = 10;
    int& ref = x;  // ref是x的引用(别名)
    
    cout << "x的值: " << x << endl;
    cout << "ref的值: " << ref << endl;
    cout << "x的地址: " << &x << endl;
    cout << "ref的地址: " << &ref << endl;  // 与x的地址相同
    
    ref = 20;  // 通过引用修改x的值
    cout << "修改后x的值: " << x << endl;
    
    return 0;
}*声明,可以不初始化(但不推荐),也可以初始化为nullptrint* ptr1;       // 未初始化的指针(危险)
int* ptr2 = nullptr;  // 空指针
int x = 5;
int* ptr3 = &x;  // 指向x的指针&声明,必须在创建时初始化,且不能初始化为nullptrint x = 5;
int& ref1 = x;   // 正确,ref1是x的引用
// int& ref2;    // 错误,引用必须初始化
// int& ref3 = nullptr;  // 错误,不能将引用初始化为空int x = 5, y = 10;
int* ptr = &x;
ptr = &y;  // 指针现在指向yint x = 5, y = 10;
int& ref = x;
ref = y;  // 这是将y的值赋给x,而不是让ref引用ynullptr),表示不指向任何对象int* ptr = nullptr;  // 空指针*运算符访问指向的对象,使用->运算符访问指向对象的成员struct Person {
    string name;
    int age;
};
Person p{"Alice", 30};
Person* ptr = &p;
cout << ptr->name << endl;  // 使用->访问成员
cout << (*ptr).age << endl; // 先解引用再用.访问成员.运算符访问成员,无需解引用Person p{"Bob", 25};
Person& ref = p;
cout << ref.name << endl;  // 直接使用.访问成员指针:支持多级指针(指针的指针)
int x = 5;
int* ptr = &x;
int**ptr_ptr = &ptr;  // 指向指针的指针
cout << ** ptr_ptr << endl;  // 输出5引用:不支持多级引用,不存在 "引用的引用"
operator=),使语法更自然// 引用作为函数参数
void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}
// 引用作为函数返回值
vector<int> vec = {1, 2, 3};
int& get_element(int index) {
    return vec[index];  // 返回向量元素的引用
}nullptr)// 指针表示空值
int* find(int* arr, int size, int target) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == target) {
            return &arr[i];
        }
    }
    return nullptr;  // 未找到,返回空指针
}
// 动态内存分配
int* create_array(int size) {
    return new int[size];  // 返回指向新分配数组的指针
}指针和引用都是 C++ 中用于间接访问变量的重要工具,它们各有特点和适用场景:
往期回顾:
结语:本篇博客给大家分享了指针和引用的对比分析以及各自的使用场景,理解指针和引用的区别,以及它们各自的适用场景,是编写高效、安全的 C++ 代码的基础。在实际编程中,应根据具体需求选择合适的工具,遵循 "能用引用就用引用,需要指针特性时再用指针" 的原则。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。