CCF-GESP 等级考试 2025年9月认证C++四级真题解析

1 单选题(每题 2 分,共 30 分)

第1题 运行下面程序后变量 a 的值是( )。

1int a = 42;

2int* p = &a;

3*p = *p + 1;

A. 42                                  B. 43                               C. 编译错误                               D. 不确定

解析:答案B*p指向变量a*p=*p+1a=a+1,运行程序后变量a的值是43。故选B

第2题 以下关于数组的描述中,( )是错误的。

A. 数组名是一个指针常量

B. 随机访问数组的元素方便快捷

C. 数组可以像指针一样进行自增操作

D. sizeof(arr)返回的是整个数组 arr 占用的字节数

解析:答案C。数组名表示首元素地址,类型为T* const(不可修改的指针),为指针常,A正确;通过下标(arr[i])O(1)时间复杂度访问任意元素,B正确;数组名虽然是首元素的地址(指针常量),但它不能直接进行自增操作(arr++)C错误;sizeof作用于数组名时返回总大小(int arr[5]返回5*sizeof(int))D正确。故选C

第3题 给定如下定义的数组arr,则 *(*(arr + 1) + 2) 的值是( )。

1int arr[2][3] = { {1, 2, 3}, {4, 5, 6}};

A. 2                                      B. 5                                   C. 4                                           D. 6

解析:答案D。二维数组名退化为指针,指向数组的行,*(arr + 1)指向第2行第1个元素,再+2,指向第3个元素,*解引用获取指针指向元素的值,相当于arr[1][2],等于6。故选D

第4题 下面这段代码会输出( )。

  1int add(int a, int b = 1); // 函数声明

  2

  3int main() {

  4    cout << add(2) << " " << add(2, 3);

  5    return 0;

  6}

  7

  8int add(int a, int b) { // 函数定义

  9    return a + b;

10}

A. 3 5                                                               B. 编译失败:定义处少了默认参数

C. 运行错误                                                      D. 链接失败:未定义引用

解析:答案Aadd(2)a=2b=1(默认),返回a+b=2+1=3add(2, 3)a=2b=3,返回a+b=2+3=5。选A

第5题 下面这段代码会输出( )。

  1int x = 5;

  2

  3void foo() {

  4    int x = 10;

  5    cout << x << " ";

  6}

  7

  8void bar() {

  9    cout << x << " ";

10}

11

12int main() {

13    foo();

14    bar();

15}

A. 5 5                                  B. 10 10                           C. 5 10                                 D. 10 5

解析:答案D。在所有函数外定义的int x=5是全局变量,在foo()函数中又定义了一个同名局部变量int x=10,所以第5行输出的x是局部变量x,输出10,如要输出 全局变量x,则需用::x表示;在bar()中没有定义同名局部变量x,所以第9行输出的x是全局变量x,输出5;总体输出10 5,故选D

第6题 下面程序运行的结果是( )。

  1void increaseA(int x) {

  2│    x++;

  3}

  4void increaseB(int* p) {

  5│    (*p)++;

  6}

  7int main() {

  8│    int a = 5;

  9│    increaseA(a);

10    cout << a << " ";

11    increaseB(&a);

12    cout << a;

13}

A. 6 7                                 B. 6 6                                C. 5 6                                   D. 5 5

解析:答案CincreaseA()函数是值传递,第9行调用时将a的值 5传递给形参x,对x的修改不影响传递变量a,所以第10行输出的a的值 5increaseB()是指针传递,第11行调用时将a的地址传递给形参p,对*p就是对a的修改,(*p)++是指针指向类型变量自增,等价a++,所以第12行输出的a的值为6;总体输出5 6,故选C

第7题 关于结构体初始化,以下四个选项中正确的是( )。

1struct Point {int x,y;};

A. Point p = (1,2);         B. Point p = {1,2};       C. Point p = new {1,2};       D. Point p = <1,2>;

解析:答案B。结构体初始化用{},排除ADB列表初始化 y 分别被赋值为 1  2B正确;new 返回的是指针,不能直接赋值给非指针变量,正确写法:

Point* p = new Point(1, 2);

D错误。故选B

第8题 运行如下代码会输出( )。

  1struct Cat {

  2│    string name;

  3│    int age;

  4};

  5

  6void birthday(Cat& c) {

  7│    c.age++;

  8}

  9

10int main() {

11    Cat kitty{"Mimi", 2};

12    birthday(kitty);

13    cout << kitty.name << " " << kitty.age;

14}

A. Mimi 2                        B. Mimi 3                       C. kitty 3                              D. kitty 2

解析:答案B。第11行定义了结构体结构体kitty,并初始化用name“Mimi”age2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值