• 19.0、C语言——指针笔试面试题


    19.0、C语言——指针笔试面试题

    1、计算出输出的结果:

    1. int main() {
    2. int a[5] = {1,2,3,4,5};
    3. int* ptr = (int*)(&a + 1);
    4. printf("%d,%d\n",*(a+1),*(ptr - 1));
    5. return 0;
    6. }

    输出的结果为 2 ,5

    2、计算出输出的结果【本题主要考察 指针 的+-整数运算】:

    1. struct Test {
    2. int num;
    3. char* pcName;
    4. short sDate;
    5. char cha[2];
    6. short sBa[4];
    7. }* p;
    8. //假设p的值为 0x100000 如下表达式的值分别为多少?
    9. //已知,结构体Test类型的变量大小是20字节
    10. int main() {
    11. p = (struct Test*)0x100000;
    12. printf("%p\n",p + 0x1);
    13. printf("%p\n",(unsigned long)p + 0x1);
    14. printf("%p\n",(unsigned int*)p + 0x1);
    15. return 0;
    16. }

    结果从上到下输出结果分别是:
            0x00100014 【p的大小已知是20字节,所以 p + 1就会跳过 20 字节,20转换为十六进制就是0x14】
            0x00100001 【强制转换成无符号long类型之后再 + 1就相当于是0x100000+0x000001】 
            0x00100004 【强制类型转换成无符号int*类型后+1等于跳过4个字节,相当于0x100000+0x000004】

    3、计算出输出的结果

    1. int main() {
    2. int a[4] = { 1,2,3,4 };
    3. int* ptr1 = (int*)(&a + 1);
    4. int* ptr2 = (int*)((int)a + 1);
    5. printf("%x,%x",ptr1[-1],*ptr2);
    6. return 0;
    7. }

    4、计算出输出的结果

    1. int main() {
    2. int a[3][2] = {(0,1),(2,3),(4,5)};
    3. int* p;
    4. p = a[0];
    5. printf("%d\n",p[0]);
    6. return 0;
    7. }

            输出的结果为 1 :
            首先我们要明白二维数组初始化中他用的是 ( ) ,那么这就是一个逗号表达式,实际上初始化的数据为 1 ,3 ,5 ,0 , 0 ,0;
            那么指针 p 存放的就是 1 的地址,p[ 0 ] = p+0  所以p[ 0 ] = 1

    5、计算出输出的结果

    1. int main() {
    2. int a[5][5];
    3. int(*p)[4];
    4. p = a;
    5. printf("%p,%d\n",&p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    6. return 0;
    7. }

    一定要重点理解:
            &arr = 整个数组的地址;
            *(&arr) = *(整个数组的地址) = arr = 数组名 = 首元素地址;
            arr[ 2 ] 相当于是 *(arr + 2) 得到数组中第三个元素的值;

    最后输出的结果是:f f f f f f f c,-4
    这里低地址减高地址为负数 - 4 

    6、计算出输出的结果

    1. int main() {
    2. int aa[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
    3. int* ptr1 = (int*)(&aa + 1);
    4. int* ptr2 = (int*)(*(aa + 1));
    5. printf("%d,%d\n",*(ptr1 - 1),*(ptr2 - 1));
    6. return 0;
    7. }

    这里需要注意的是:ptr1 的类型不是数组指针类型而是 int*类型
    输出的结果是:10,5

    7、计算出输出的结果

    1. int main() {
    2. char* a[] = { "work","at","alibaba" };
    3. char** pa = a;
    4. pa++;
    5. printf("%s\n",*pa);
    6. return 0;
    7. }

            这里要掌握 指针 + 1 到底跳过多少字节,之前我们也说过这个取决于该指针指向的变量是什么类型,例如 int* p = &a; 那么p + 1 就跳过4个字节的

             一开始指针 pa 中存放的是数组 a[] 中首元素的地址,然后 pa++ 【这里要知道 pa 的类型是char*】也就是存放在 pa 中的地址 + 1  -> 往下跳过一个char*类型的内存空间,此时 pa 中存放的地址就变成了 "at" 第二个字符串元素的首地址

    8、计算出输出的结果

    1. int main() {
    2. char* c[] = {"ENTER","NEW","POINT","FIRST"};
    3. char** cp[] = {c+3,c+2,c+1,c};
    4. char*** cpp = cp;
    5. printf("%s\n",**++cpp );
    6. printf("%s\n", *--*++cpp+3);
    7. printf("%s\n", *cpp[-2]+3);
    8. printf("%s\n", cpp[-1][-1]+1);
    9. return 0;
    10. }

     输出的结果为:
            POINT
            ER
            ST
            EW

    这道题相对来说比较复杂,但是解题方法和前面的差不多就不过多解释了;
    只要弄清楚 cpp[ -2 ] 相当于是 *(cpp - 2) 这个相关概念即可;

  • 相关阅读:
    设计模式-中介者模式
    【QT+QGIS跨平台编译】056:【pdal_lazperf+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
    C语言之指针练习题
    不能创建第三个变量,实现两个数的交换
    Vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)
    Sublime Text的安装过程记录
    Win11怎么修改关机界面颜色?Win11修改关机界面颜色的方法
    ElasticSearch介绍和基本用法(一)
    redis集群的三种方式
    JS,数组语法+示例,超详细!!!
  • 原文地址:https://blog.csdn.net/m0_52433668/article/details/126763641