int func() {
int a = 10;
return a; // ✅ 返回值(复制),不是返回地址
}
int main() {
int value = func();
cout << value << endl; // 输出 10
cout << value << endl; // 输出 10
return 0;
}
方法4:使用引用参数
cpp复制代码
void func(int& result) {
result = 10; // 通过引用修改外部变量
}
int main() {
int a = 0;
func(a);
cout << a << endl; // 输出 10
return 0;
}
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++中主要利用new在堆区开辟内存
**示例:
1.3 new操作符
C++中利用==new==操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 ==delete==
语法:` new 数据类型`
利用new创建的数据,会返回该数据对应的类型的指针
**示例1: 基本语法
cpp复制代码
int* func() {
int* a = new int(10); // ① 在堆区分配内存
return a; // ② 返回堆内存地址
}
int main() {
int *p = func(); // ③ p 指向堆内存
cout << *p << endl; // ④ 输出 10
cout << *p << endl; // ⑤ 再次输出 10
delete p; // ⑥ 释放堆内存
// cout << *p << endl; // ⑦ 错误!内存已释放
return 0;
}
核心要点:
new 在堆区分配内存,返回地址
堆内存不会自动释放 ,必须手动 delete
函数返回堆内存地址是安全的(内存还在)
delete 后指针变成野指针,不能再使用
堆内存的生命周期由程序员控制,可以跨函数
cpp复制代码
#include <iostream>
using namespace std;
int main() {
// 1. 基本类型
int* pInt = new int(10); // new int → 返回 int*
double* pDouble = new double(3.14); // new double → 返回 double*
char* pChar = new char('A'); // new char → 返回 char*
// 2. 数组
int* pArray = new int[5]; // new int[5] → 返回 int*(首元素地址)
// 3. 结构体/类
struct Student { string name; int age; };
Student* pStu = new Student{"张三", 20}; // new Student → 返回 Student*
// 4. 使用指针访问
cout << *pInt << endl; // 10
cout << pArray[0] << endl; // 数组方式访问
cout << pStu->name << endl; // 结构体成员访问
// 释放内存
delete pInt;
delete pDouble;
delete pChar;
delete[] pArray;
delete pStu;
return 0;
}
**示例2:开辟数组
cpp复制代码
//堆区开辟数组
int main() {
int* arr = new int[10];
for (int i = 0; i < 10; i++)
{
arr[i] = i + 100;
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
//释放数组 delete 后加 []
delete[] arr;
system("pause");
return 0;
}