1. 指针基础与常见陷阱解析
指针是C++中最令人头疼也最强大的特性之一。记得我第一次参加GESP考试时,指针相关的题目错了一半,后来才发现问题都出在对基本概念的理解偏差上。指针本质上就是一个存储内存地址的变量,就像快递单号记录着包裹的实际存放位置。
最常见的错误莫过于混淆指针声明方式。比如题目中出现的int* p和int *p,其实这两种写法完全等效,但很多同学会纠结空格位置。更危险的是下面这种错误:
cpp复制int* p1, p2; // p1是指针,p2却是普通int变量
这里p2并不是指针!正确的多指针声明应该是:
cpp复制int *p1, *p2; // 两个都是指针
二维数组的指针传递也是高频考点。当函数参数需要接收二维数组时,这三种写法是等价的:
cpp复制void func(int arr[3][4]); // 固定维度
void func(int arr[][4]); // 省略行数
void func(int (*arr)[4]); // 数组指针
但绝对不要用int** arr,这会导致内存访问错误。我在项目调试中就踩过这个坑——程序运行时莫名其妙崩溃,最后发现就是二维数组传递方式用错了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 函数参数传递的三种姿势
参数传递看似简单,实则暗藏玄机。值传递就像复印文件,函数拿到的是副本;引用传递相当于直接操作原文件;指针传递则是给你文件柜的钥匙。
看这个典型考题:
cpp复制struct Student {
string name;
int score;
};
void modify(Student s) { s.score = 90; } // 值传递
void modify(Student &s) { s.score = 90; } // 引用传递
void modify(Student *s) { s->score = 90; }// 指针传递
考试中最容易混淆的是函数声明和作用域。记住这个口诀:"函数调用先声明,作用域里找最近"。比如下面代码会编译失败:
cpp复制int main() {
greet(); // 错误!未声明
return 0;
}
void greet() { co
