• c++指针和引用之高难度(一)习题讲解


    1.【单选题】

    int a { 5000 };

    int* ptrA { &a };

    a++;

    *ptrA = ?

    A 5000         B 5001         C 5002

    解析:ptrA是指向变量a的内存地址,变量a++,解引用ptrA的值也会变化,结果为5001。

    2.【单选题】

    int a { 5000 };

    char logo { 65 };

    int* ptrA { &a };

    char* ptrlogo { &logo };

    int c = sizeof ( int* ) + sizeof ( char* );

    假设当前程序的编译架构为x64,

    c=??

    A 64         B 16        C8

    解析:在x64架构下,指针(无论是int*char*还是其他任何类型的指针)的大小通常都是64位(即8字节)。这是因为64位系统使用64位地址空间来寻址内存中的对象。所以选B。

    3.【单选题】

    int a[] {1001,1002,1003};

    int* ptrA  { &a[0] };

    *ptrA++;

    int c = (*ptrA)++;

    c=??

    A1001         B1002         C1003

    解析:这道题首先ptrA指向了1001的地址,然后*ptrA++,指针的加法等于加上数据类型的字节长度乘以数量,此时ptrA又指向的1002的地址。int c = (*ptrA)++,后置递增,c就等于1002,选B。

    4.【单选题】

    int a { 0x12345678 };

    short* b { (short*)&a };

    *b = 0xFF;

    a = ?

    A 0x123456FF         B 0xFF345678        C 0x123400FF

    解析:这道题int占用4个字节,short占用2个字节,将b用强制类型转换为a的指针,然后对b重新赋值,会改变a的值,此时a的后两个字节将会被覆盖掉,也就是 5678 会被替换为 00FF,答案选C。

    5.【单选题】

    int        a { 0x12344241 };

    char* b { (char*)&a };

    *b++;

    std:.cout << *b;

    A A         B B         C 0x41

    解析:char 占用一个字节,将 b 用类型转换指向 a的地址,此时 b 指向的就是 0x41的地址,*b++,地址会向前一位,此时指向0x42的地址,十进制为 66 ,对应ASCII表中B,所以选B。

    6.【单选题】

    int a[] { 1000,1001,1002 };

    int *b{ &a[1] };

    int** c { &b };

    std::cout << &a [1];

    此时屏幕输出了0050000,

    *c++;

    std::cout<

    输出什么?

    A 1002         B 0050000         C 0050004         D 未知

    解析:b指向了数组a【1】的地址,c是一个二级指针,指向的是b的地址,此时屏幕输出了0050000,说明 b 就等于 0x0050000,*c++ 就等于 c++ ,说明  c 就等于 b的地址 加 4,但是对 b 没有影响 ,此时 b 依然等于 0x0050000,选B。

    7.【单选题】

    const int a { 1000 };

    const int b { 2000 };

    const int* c { &a };

    以下哪句代码将不能运行?

    A c = &b;        B *c = 9000;        C c = (int*)0;

    解析: const int* c { &a }; 说明 c 是一个常量指针, 指针指向可以改,指针指向的值不可以更改,所以选B。

    8.【多选题】

    int a { 1000 };

    int b { 2000 };

    int* const c { &a };

    以下哪句代码将不能运行?

    A c = &b;        B *c = 9000;        C c = (int*)0;

    解析:int* const c { &a }; 说明 c 是一个指针常量,指针指向不可以改,指针指向的值可以更改,所以选 A 和 C。

    9.【多选题】

    int a { 1000 };

    int b { 2000 };

    const int* const c { &a };

    以下哪句代码将不能运行?

    A c = &b;        B *c = 9000;        C c = (int*)0;

    解析:int* const c { &a }; 说明 const 即修饰指针,又修饰常量,所以 A, B 和 C都不能运行。

    10.【单选题】

    int a[] { 1000,1001,1002 };

    int *b{ &a[1] };

    int** c { &b };

    std::cout << &a [1];

    (*c)++;

    std::cout<

    输出什么?

    A 1002         B 0050000         C 0050000         D 未知

    解析:这一题与 第七题的区别是 (*c)++ 不同,c 是一个二级指针,指向 指针 b 的地址,因为 *c  = b ,此时(*c) ++,可以等效于 b++ , 而 b 是 int 的类型的指针,所以会加 4,之前 b 等于 0050000,加 4 后等于 0050004,所以选C。

  • 相关阅读:
    从零开始 通义千问大模型本地化到阿里云通义千问API调用
    【Linux】:vi 编辑器的使用
    【数据结构】万字链表详解
    不同温度与工况的放电曲线与内阻曲线
    LeetCode第 91 场双周赛题解
    10 Deployment:让应用永不宕机
    亚马逊精细化运营是什么意思?旺季如何高效进行数据精细化运营?—站斧浏览器
    智能终端信息安全概念(四):硬件安全技术—主芯片安全技术(2)
    腾讯云服务器与普通服务器区别在哪?如何选择?
    110道 MySQL面试题及答案 (持续更新)
  • 原文地址:https://blog.csdn.net/m0_62681656/article/details/140001640