如何解决这种类型的问题?求解,有了解这种情况的或出现过类似情况的都可以提,帮帮忙,谢谢大家!
1条回答 默认 最新
关注 【相关推荐】
- 你可以看下这个问题的回答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).
结果:
这里我在将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道笔试题,那指针就会很难出错了,当然刷题永无止境。
如有错误,还请读者指出,像大厂进发!!!
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报
悬赏问题
- ¥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的运行库