GESP C++ 四级易错点总结
在C++四级考试中,指针地址偏移量搞错1字节,可能让你与满分失之交臂;二维数组访问的行列混淆,足以让精心设计的算法功亏一篑。这些看似细微的陷阱,往往是区分高分与平庸的关键。
一、指针与地址操作(高频考点)
指针操作是四级考试的核心难点。
易错点1:指针运算的步长
指针加减整数时,实际偏移量 = 整数值 × 所指向类型的大小
int a = 10;
int *p = &a; // 假设&a = 0x6ffe14
p++; // p的值变为0x6ffe18(int占4字节)
易错点2:指针解引用与赋值
int x = 20;
int* p = &x;
*p = *p + 2; // 此时x=22, *p=22
真题示例:
int x[10][10][10] = {0};
int *p = &x[0][0][0]; // 假设cout<<p输出0x6ffe00
cout << *(p+1); // 输出地址0x6ffe04(int[10][10]步长为400字节)
二、二维数组内存布局(超高频错误)
内存本质:二维数组按行优先连续存储
易错点1:数组名与指针关系
int arr[3][16];
// arr[1] 的地址 = arr[0] + 1×16×sizeof(int) = 0x28cbc0 + 64
易错点2:元素地址计算
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
// arr[1][2]地址 = 首地址 + (1*3 + 2)*4
三、函数参数传递(引用vs指针)
易错点1:引用传递修改原值
void swap(int a, int &b) {
int temp = a;
a = b;
b = temp; // 只有b会修改外部值
}
int main() {
int x=1, y=2;
swap(x,y); // 调用后x仍为1,y变为1
}
易错点2:指针传递的必要性
void func(int& x) {
x = x * 2; // 修改会影响外部变量
}
int a = 5;
func(a); // a变为10
四、排序算法实现(手写代码核心)
易错点1:冒泡排序标志位优化
void bubbleSort(vector<int> &nums) {
for (int i = nums.size()-1; i>0; i--) {
bool flag = false; // 初始化标志位
for (int j=0; j<i; j++) {
if (nums[j] > nums[j+1]) {
swap(nums[j], nums[j+1]);
flag = true; // 发生交换时标记
}
}
if (!flag) break; // 未交换说明已有序
}
}
易错点2:选择排序不稳定特性
// 选择排序是非稳定排序!
void selectionSort(int arr[], int n) {
for (int i=0; i<n-1; i++) {
int minIdx = i;
for (int j=i+1; j<n; j++) {
if (arr[j] < arr[minIdx])
minIdx = j;
}
swap(arr[i], arr[minIdx]); // 可能破坏相同元素顺序
}
}
五、异常处理机制(必考知识点)
易错点1:异常类型匹配
double hmean(double a, double b) {
if (a == -b)
throw runtime_error("Division by zero"); // 抛出runtime_error类型
}
try { hmean(10, -10); }
catch (const runtime_error& e) { // 正确匹配类型
cout << "Caught: " << e.what();
}
catch (...) { // 兜底捕获
cout << "Unknown error";
}
易错点2:未捕获异常导致terminate
try {
throw "error"; // 抛出const char*类型
}
catch (int e) { } // 类型不匹配!
// 程序将调用std::terminate()终止
六、结构体与数组高级用法
易错点:结构体嵌套初始化
struct Address {
string street;
string city;
};
struct Person {
string name;
Address addr; // 嵌套结构体
};
Person p = {"Tom", {"Main St", "New York"}}; // 正确初始化方式