C++笔记 2026-05-27
呜呜呜忘记保存了这是AI重写的
title: C++笔记 2026-05-27
date: 2026-05-27 18:00:00
tags: [oipractice, programming, cpp]
category: cpp
cover: https://photos.leyanshi.me/cpp.png
函数与指针
Conception & Usage
指针就是地址,函数参数传指针可以修改外部变量。
传值 vs 传指针:
- 传值:函数内部改的是副本,外面不变
- 传指针:函数内部通过地址访问原变量,外面跟着变
基本示例
&&&cpp
#include
using namespace std;
void swap(int* a, int* b) {
int temp = *a; // *a 取指针指向的值
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
swap(&x, &y); // 传入地址
cout << x << “ “ << y << endl; // 10 5
}
&&&
字符串与指针
字符串本质是 char 数组,数组名就是首地址。
&&&cpp
#include
#include
using namespace std;
void printLength(char* str) {
cout << strlen(str) << endl;
}
int main() {
char s[] = “hello”;
printLength(s); // 数组名即指针,直接传
}
&&&
二级指针(指针的指针)
二级指针存的是指针的地址,可以修改指针本身。
作业题:字符串双倍函数
不能使用函数返回,只能通过参数传入指针
double(char* str, char** result)
思路:
str是原字符串result是二级指针,指向一个char*变量- 函数内部动态分配新内存,把原字符串重复两次放进去
- 让
*result指向这块新内存
&&&cpp
#include
#include
using namespace std;
void doubleStr(char* str, char** result) {
int len = strlen(str);
// 新长度 = 原长 * 2 + 1(结尾 ‘\0’)
char* newStr = new char[len * 2 + 1];
// 复制第一遍
strcpy(newStr, str);
// 接上第二遍
strcat(newStr, str);
// 让二级指针指向的指针指向新字符串
*result = newStr;
}
int main() {
char original[] = “abc”;
char* doubled = nullptr;
doubleStr(original, &doubled); // 传入二级指针的地址
cout << doubled << endl; // abcabc
delete[] doubled; // 释放堆内存
return 0;
}
&&&
关键点总结
| 写法 | 含义 |
|---|---|
int* p |
p 是指向 int 的指针 |
&x |
取 x 的地址 |
*p |
取 p 指向的值 |
int** pp |
pp 是指向 int* 的指针(二级指针) |
*result |
拿到 result 指向的那个指针 |
**result |
拿到最终指向的 int 值 |
常见错误
- 忘记
delete[]会导致内存泄漏 - 传入
NULL指针,函数内部没检查直接解引用会崩溃 - 返回局部变量的地址(函数结束就销毁了)
练习建议
- 手写
strcpy和strcat的指针版本 - 用二级指针实现“函数内部动态分配数组,外部能使用并释放”
