<返回目录     Powered by claude/xia兄

第8课: 引用与动态内存

引用基础

#include <iostream>
using namespace std;

int main() {
    int num = 10;
    int &ref = num;  // ref是num的引用(别名)

    cout << "num = " << num << endl;
    cout << "ref = " << ref << endl;

    // 修改引用会影响原变量
    ref = 20;
    cout << "修改ref后,num = " << num << endl;

    // 引用和原变量地址相同
    cout << "num地址:" << &num << endl;
    cout << "ref地址:" << &ref << endl;

    return 0;
}

引用作为函数参数

#include <iostream>
using namespace std;

// 引用传递:可以修改原变量
void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

// 常量引用:不能修改,但避免拷贝
void printValue(const int &val) {
    cout << "值:" << val << endl;
    // val = 100;  // 错误!不能修改常量引用
}

int main() {
    int x = 10, y = 20;
    cout << "交换前:x=" << x << ", y=" << y << endl;

    swap(x, y);
    cout << "交换后:x=" << x << ", y=" << y << endl;

    printValue(x);

    return 0;
}

引用作为返回值

#include <iostream>
using namespace std;

int& getElement(int arr[], int index) {
    return arr[index];  // 返回引用
}

int main() {
    int arr[5] = {1, 2, 3, 4, 5};

    // 通过引用修改数组元素
    getElement(arr, 2) = 100;

    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}

动态内存分配 - new和delete

#include <iostream>
using namespace std;

int main() {
    // 动态分配单个变量
    int *ptr = new int;
    *ptr = 100;
    cout << "动态分配的值:" << *ptr << endl;
    delete ptr;  // 释放内存

    // 动态分配并初始化
    int *ptr2 = new int(50);
    cout << "初始化的值:" << *ptr2 << endl;
    delete ptr2;

    // 动态分配数组
    int size = 5;
    int *arr = new int[size];

    for (int i = 0; i < size; i++) {
        arr[i] = i * 10;
    }

    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    delete[] arr;  // 释放数组内存

    return 0;
}

内存泄漏

#include <iostream>
using namespace std;

void memoryLeak() {
    int *ptr = new int(100);
    // 忘记delete,造成内存泄漏
}

void correctUsage() {
    int *ptr = new int(100);
    // 使用ptr
    delete ptr;  // 正确释放
    ptr = nullptr;  // 避免野指针
}

int main() {
    correctUsage();
    return 0;
}

动态二维数组

#include <iostream>
using namespace std;

int main() {
    int rows = 3, cols = 4;

    // 分配二维数组
    int **matrix = new int*[rows];
    for (int i = 0; i < rows; i++) {
        matrix[i] = new int[cols];
    }

    // 初始化
    int count = 1;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = count++;
        }
    }

    // 打印
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }

    // 释放内存
    for (int i = 0; i < rows; i++) {
        delete[] matrix[i];
    }
    delete[] matrix;

    return 0;
}

引用 vs 指针

练习题

  1. 使用引用实现三个数的排序函数
  2. 动态分配数组,输入n个数字并计算平均值
  3. 实现动态字符串拼接功能
  4. 编写程序动态创建矩阵并进行转置