Leyanshi
Articles7
Tags3
Categories1

Categories

一言

Archive

C++笔记 2026-05-27

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)

思路:

  1. str 是原字符串
  2. result 是二级指针,指向一个 char* 变量
  3. 函数内部动态分配新内存,把原字符串重复两次放进去
  4. *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 指针,函数内部没检查直接解引用会崩溃
  • 返回局部变量的地址(函数结束就销毁了)

练习建议

  1. 手写 strcpystrcat 的指针版本
  2. 用二级指针实现“函数内部动态分配数组,外部能使用并释放”