• 【C语言进阶】--指针典题剖析


    ced485cbb11e458d81a746890b32cf3f.gif

    🎈🎈 作者 whispar
    🎈🎈专栏 : C语言从无到有

    ✨放低姿态,空杯心态✨

    7abc9c8906564477a6679bb15d368e37.gif


    目录

    指针(进阶)--笔试题剖析

    笔试题一

    笔试题二

    笔试题三

    笔试题四

    笔试题五

    笔试题六

    笔试题七


    指针(进阶)--笔试题剖析

    笔试题一

    ✅程序的结果是什么?

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

    cb8957bd4f84fba214c31c9546e8e8f3.png

    详解:&a取出的是整个数组的地址 ,&a+1表示增加了一整个数组的大小,单位是字节

    数组名a为首元素的地址&a[0],则*(a+1)即 a[1] 的值

    故答案为2 5

    笔试题二

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

    d3da0f0ab26d6c9e9175f2357c08c5ac.png

    详解:

    &a取出的是整个数组的地址 ,&a+1表示增加了一整个数组的大小,单位是字节

    ptr1[-1] = ptr1 -1 , 由图可知 ,(int *)(&a + 1) 在内存中指向的是 04 00 00 00

    使用%x打印即 00 00 00 04, 故 ptr1[-1] = 4

    由上图可知,(int*)((int)a+1) 在内存中指向的是 00 00 00 02

    在小端存储模式下用十六进制表示,即 02 00 00 00

    使用%x打印即 2 00 00 00, 故*ptr2 = 2 00 00 00

    笔试题三

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

    详解:

    int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    //          =  {1,3,5}
    //  1  3   a[0] 即第一行的数组名 ,p= a[0]则p[0] = a[0][0] = 1
    //  5  0
    //  0  0

    笔试题四

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

    390b1d46e9222dc13a760f52bc963a3f.png

    详解:

    &p[4] [2] - &a[4] [2] 指针相减得到元素个数,为4个,又低地址-高地址,%d打印结果为 -4

    使用%p打印时,打印-4地址

    原码10000000 00000000 00000000 0000 0100

    反码11111111 11111111 11111111 11111011

    补码11111111 11111111 11111111 11111100

    即FF FF FF FC

    48b051516406ef43fdbf38fca59a6c9a.png

    笔试题五

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

    55453f043934b2e7b58db705867cba05.png

    详解:

    &aa取出的是整个数组的地址 ,&aa+1表示增加了一整个数组的大小,单位是字节

    aa 表示的是首元素的地址

    笔试题六

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

    c28d99757133ffbbd132d7355e5b6482.png

    详解: char* a[] 为一个存放字符串地址的数组,其中a 表示字符串”work“首元素的地址, 赋值给了pa

    pa++时,向前移动一个char*的大小,即指向字符串”at'' 的首元素的地址,故 *pa = "at";

    笔试题七

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

    详解:如下示

    1. #include
    2. #include
    3. int main()
    4. {
    5. char* c[] = {"ANTER","NEW","POINT","FIRST"};
    6. char** cp[] = {c + 3,c + 2,c + 1,c};
    7. char*** cpp = cp;
    8. printf("%s\n",**++cpp);//POINT
    9. //cpp+1指向c+2,两次解引用后找到POINT
    10. printf("%s\n", *--*++cpp + 3);//ER
    11. //++cpp:cpp指向c+1
    12. //*(++cpp):得到c指针数组的第二个元素的指针的内容
    13. //--(*(++cpp)):第二个元素指针-1,得到第一个元素指针的内容
    14. //*(--(*(++cpp))):解引用得到ENTER
    15. //*(--(*(++cpp)))+3:指向E,输出ER
    16. printf("%s\n",*cpp[-2]+3);//ST
    17. //注意cpp到目前为止还是指向c+1,cpp[-2]指向的地址内容变化,cpp的指向并未变化
    18. //*cpp[-2]==*(*(cpp+(-2))) 所以*cpp[-2]指向,c+3,得到的是FIRST
    19. //*cpp[-2]+3指向S
    20. printf("%s\n",cpp[-1][-1]+1);//EW
    21. //注意cpp到目前为止还是指向c+1
    22. //cpp[-1][-1]+1 == *(*(cpp-1)-1)+1
    23. //*(cpp-1)指向c+2;
    24. //*(*(cpp-1)-1)指向c[2]的内容;
    25. //*(*(cpp-1)-1)+1指向NEW中的N
    26. return 0;
    27. }

    327793ac3daa994664ef9bae8d27077b.png

                                           

         💖如果文章对你有帮助,请多多点赞、收藏、评论、关注支持!!💖        

    ced485cbb11e458d81a746890b32cf3f.gif

  • 相关阅读:
    如何在 GNU Linux 上通过 Nvm 安装 Node 和 Npm?
    【自动驾驶】常见位姿估计算法的比较: 三角测量、PNP、ICP、
    【Transformers】第 3 章:自动编码语言模型
    vue入门到精通-第一个vue程序和基本语法组件
    Vue——条件判断、循环遍历
    基于JAVA旅行网的设计与实现计算机毕业设计源码+数据库+lw文档+系统+部署
    【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 )
    MySQL索引与表结构
    嵌入式web 服务器boa的编译和移植
    ubuntu server 24.04 使用记录
  • 原文地址:https://blog.csdn.net/m0_56361048/article/details/126078875