• 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) 这个相关概念即可;

  • 相关阅读:
    tomcat动静分离
    APP UI自动化测试思路总结 ,教你彻底学会APP自动化测试
    java计算机毕业设计基于ssm的火车订票管理系统(源代码+数据库+Lw文档)
    c语言编程题经典100例——(41~45例)
    JSP教师辅助办公软件教学进程管理系统yeclipse开发mysql数据库bs框架java编程jdbc详细设计
    MySQL高级SQL语句
    根据 Application ID找到 Hive 的 SQL 语句
    基于SSM的快递管理系统设计与实现
    OSS数据处理
    intellij idea如何查看项目maven依赖关系图
  • 原文地址:https://blog.csdn.net/m0_52433668/article/details/126763641