suifengQvQ 2023-12-22 14:33 采纳率: 0%
浏览 2

关于#c语言#的问题,请各位专家解答!

如何解决这种类型的问题?求解,有了解这种情况的或出现过类似情况的都可以提,帮帮忙,谢谢大家!

img

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-25 21:16
    关注

    【相关推荐】



    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7578688
    • 这篇博客也不错, 你可以看下变量名错误;变量还没有定义,就直接使用;变量的输入与使用顺序不当;数据输入时,数据的类型不匹配
    • 您还可以看一下 韦语洋(Lccee)老师的一机一码加密、被破解自动销毁随时授权回收升级系列视频课程课程中的 软件界面的制作与介绍小节, 巩固相关知识点
    • 除此之外, 这篇博客: 8道大厂指针笔试题让你秒杀指针!!!中的 这篇博客收录了8道大厂的指针笔试题,这8道题涵盖的知识点比较全面,所以我认为有必要分享出来,相信只要理解这8道题,那其他的指针题都会迎刃而解。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      废话不多说,直接上题:

      第一题:

      
      int main()
      {
          int a[5] = { 1, 2, 3, 4, 5 };
          int *ptr = (int *)(&a + 1);
          printf( "%d,%d", *(a + 1), *(ptr - 1));
          return 0;
      }
      读者可以先自己做一下,做出来后再来看解答哦;
      

      解答

      在这里插入图片描述
      所以*(a+1)应该是a+1指向的元素,也就是2,*(ptr-1)应该是5。

      结果
      在这里插入图片描述

      第二题:

      struct Test
      {
      	int Num;
      	char *pcName;
      	short sDate;
      	char cha[2];
      	short sBa[4];
      }*p;//定义了一个结构体指针 p
      
      结构体的大小是20
      
      int main()
      {
          p=(struct Test *)0x00100000;//将16进制数字转换为结构体地址存放到p中
      	printf("%p\n", p + 0x1);
      	printf("%p\n", (unsigned long)p + 0x1);
      	printf("%p\n", (unsigned int*)p + 0x1);
      	return 0;
      }S
      
      

      解答
      在这里插入图片描述

      结果在这里插入图片描述

      第三题:

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

      想要做对这道题,就要求我们对数据在内存中的存储有一个比较好的掌握,起码得知道小端存储
      在这里插入图片描述
      上图展示的是数组a的四个元素在内存中的存储方式,注意这里的数字都是16进制,所以一个格子是一个字节。
      先说*ptr1:
      在这里插入图片描述
      在以%x打印的时候,在内存中的读取是反向的,所以打印出来应该是
      00000004**

      ptr2:
      在这里插入图片描述
      以%x打印适合反向打印得02000000

      结果:这里面4和2前面的0都省略了,因为它们没任何作用。
      在这里插入图片描述

      第四题:

      #include <stdio.h>
      int main()
      {
          int a[2][3] = { (0, 1), (2, 3), (4, 5) };
          int *p;
          p = a[0];
          printf( "%d", p[0]);
       return 0;
      }
      

      解答:
      在这里插入图片描述

      结果:
      在这里插入图片描述
      第五题:

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

      解答:
      黑色方框中为*(*(p+4)+2)
      黑色方框中为*((p+4)+2).
      在这里插入图片描述
      结果:
      在这里插入图片描述
      这里我在将a赋值给p的时候用了强制类型转换,因为在2013上不转换的话跑不过去,因为a的类型是int(
      )[5],p的类型是int (*)[4],有的编译器只会出现警告,不会报错。

      第六题:

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

      解答:

      在这里插入图片描述
      结果:
      在这里插入图片描述

      第七题:

      int main()
      {
      	char *a[] = { "work", "at", "tencent" };
      	char **pa = a;
      	pa++;
      	printf("%s\n", *pa);
      	return 0;
      }
      

      解答:
      不知道大家是否对字符指针有比较深的印象,温习一下吧
      在这里插入图片描述
      字符串赋给字符指针的时候只是将第一个字符的地址给了p;
      在这里插入图片描述
      结果:
      在这里插入图片描述

      第八题:

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

      解答:
      第一个
      在这里插入图片描述
      第二个
      注意:第一次打印的时候++cpp,所以cpp是指向c+2的,不是指向c+3
      在这里插入图片描述
      第三个

      在这里插入图片描述
      第四个
      cpp[-1][-1]可以化为*(*(cpp-1)-1),相信读者已具备能力解答。

      结果:
      在这里插入图片描述

      不知道读者做完这8道题感觉如何,不管是好是坏,相信只要理解这8道笔试题,那指针就会很难出错了,当然刷题永无止境。

      如有错误,还请读者指出,像大厂进发!!!


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月22日

悬赏问题

  • ¥15 淘宝自动下单XPath自动点击插件无法点击特定<span>元素,如何解决?
  • ¥15 曙光1620-g30服务器安装硬盘后 看不到硬盘
  • ¥15 抖音直播广场scheme
  • ¥15 为什么我明明有这个文件调试器还显示错误?
  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库