第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 指针
- 引用必须初始化,指针可以不初始化
- 引用初始化后不能改变指向,指针可以
- 引用没有空引用,指针可以为空
- 引用更安全,指针更灵活
- 引用语法更简洁,指针需要解引用
练习题
- 使用引用实现三个数的排序函数
- 动态分配数组,输入n个数字并计算平均值
- 实现动态字符串拼接功能
- 编写程序动态创建矩阵并进行转置