GESP C++ 四级易错点总结

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"}};  // 正确初始化方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值