| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言指针水平检测题,答对大部分证明对指针就有一定的了解了!!! -> 正文阅读 |
|
[C++知识库]C语言指针水平检测题,答对大部分证明对指针就有一定的了解了!!! |
文章目录注:以下分析均在32位环境下运行 1.小题第一题:
答案: 1.a是数组名,表示首元素地址。但在sizeof内部单独出现(不单独出现仍然表示首元素地址,这里的单独出现指的是不进行运算) 的时候表示整个数组,因此整个数组大小是16. 2.a没有单独出现在sizeof内部,因此(a+0)此时代表首元素地址。因此答案是4 3.a是首元素地址,*a是第一个元素1,1是整型,因此大小是4 4.a没有单独出现在sizeof内部,此时表示首元素地址。a+1表示跳过了一个整型,此时a+1是第二个元素的地址,因此大小是4. 5.a[1]等价于*(a+1),相当于在例(4)的基础上解引用,代表第二个元素,大小是4. 6.&a代表整个数组的地址(区分开首元素地址),&a的类型是数组指针,是int(*)[4]类型的。是指针的话大小也是4 对数组指针不了解的看: 7.解引用和取地址符号抵消了,剩下a,单独出现在sizeof内部。表示整个数组,因此大小是16 8.&a表示整个数组的地址,由于类型是int(*)[4],对&a+1则表示跳过整个数组。越界了,虽然越界,但sizeof里并不会真的去访问这段空间,它只看sizeof里面的操作数是什么类型的。此时仍然是数组指针。因此大小仍然是4. 对于sizeof不会访问对应空间可以看这两个例子
9.代表首元素地址,大小是4 10.代表第二个元素地址,大小是4 第二题
答案: 仔细看这里并不是全部的答案,10和11两条语句是会使程序崩溃的。(运行时把它注释了) 分析: 2.arr没有单独出现在sizeof内部,arr表示的是首元素地址,大小是4 3.*arr表示第一个元素字符a,大小是1 4.和3同理 5.&arr表示整个数组的地址,是一个数组指针,大小是4 6.&arr+1表示一个数组指针,大小是4.(和第一题的(8)同理) 7.&arr[0]表示第一个元素地址,加一表示第二个元素地址。大小是4. 从第八题开始是strlen,别看错了。 8.strlen的原理是找NUL,由于arr里面没有,因此它会一直往数组后越界访问,直到它找到NUL. 因此长度是随机值 9.和8同理,也是随机值 10.第十题是有点让人困惑的。表达式的意思是strlen(‘a’),这是什么意思呢?计算机认为这是把a的ASCII码值当作地址传入strlen了。由于操作系统不允许访问地址为97的空间,因此程序会崩溃。 11.和10同理,相当于访问地址为98的空间,这是不允许的。程序会崩溃 12.&arr是整个数组的地址,类型是char(*)[6],在传入strlen时会被强制转换为char*类型。&arr的地址和arr是一样的,因此答案应该和第8小题一样,也是随机值。 13.&arr+1是跳过整个数组,然而它仍是一个地址,strlen会从那个地址继续往后找NUL,长度仍是随机值。有趣的是,它比第12小题的随机值少6。 14.相当于从第二个元素开始出发找NUL,长度仍然是随机值。有趣的是它比第12小题的随机值少1. 第三题
答案:有两条语句会导致程序崩溃哦。这是注释后的运行结果 2.arr没有单独出现在sizeof内部,因此a这里是首元素的地址,大小是4 3.对arr解引用是字符a,因此大小是1 4.和小题3同理,大小是1 5.&arr是整个数组的地址,类型是char(*)[7],是地址大小就是4 6.和5同理,大小是4 7.是第二个元素的地址,大小是4 下面的是strlen了 8.终于到常规的strlen的使用了,长度是6 9.和小题8同理,长度是6 10.*a是第一个字符’a’,相当于strlen(97),程序会崩溃 11.和第10小题同理 12.&arr的地址和arr相同,虽然类型是数组指针但在传入strlen的时候,会强制转换成char*。长度也是6 13.&arr+1相当于跳过一整个数组,因此NUL的位置就是未知的了。长度是随机值 14.相当于第二个元素的地址,因此长度是5 第四题
答案: 分析: 2.p+1是第二个字符的地址,大小是4 3.*p是一个字符,大小是1 4.p[0]是一个字符,大小是1 5.&p的类型是char**,仍然是指针,大小是4 6.&p+1的类型仍然是char**,虽然越界了然无所谓,sizeof不会真的访问那段空间,大小是4 7.第二个字符地址,大小是4 下面是strlen了 8.长度是6,这个超简单 9.长度是5,这个也简单对吧 10.相当于strlen(97),老套路了。不解释了。 11.和小题10同理 12这道题有点不同,&p的类型是char**,它里面存的是p的地址,可它自己的地址可是未知的。因此长度是随机值。 13.char**+1的地址也是未知的,长度是随机值 14.长度是5 有没有发现,只要原理懂了其实套路都是一样的! 第四题
答案: 分析: 2.a[0][0]是第一个元素,大小是4 3.a[0]是第一行的数组名。它单独出现在sizeof内部,因此代表整个第一行数组,大小是4×4等于16
4.a[0]是第一行数组名,但它没有单独出现在sizeof内,因此它代表的是第一行第一列的元素的地址,加1后变成第一行第二列的元素的地址。因此大小是4 5.在小题4的基础上解引用得到了第一行第二列的元素,因此大小是4 6.a是二维数组数组名,但没有单独出现在sizeof内部,因此a代表第一行数组的地址,+1得到第二行数组的地址。类型是int(*)[4]的数组指针。大小是4 7.在小题6的基础上解引用得到了第二行首元素的地址,即第二行的数组名。它单独出现在sizeof内部。因此大小是16 8.a[0]是第一行首元素地址,&a[0]是第一行地址,&a[0]+1是第二行数组地址,类型是数组指针,大小是4 9.在8的基础上解引用,得到了第二行数组的首元素地址,它是第二行数组的数组名,因此大小是16、 10.a是第一行数组的地址,*a是第一行首元素地址,它单独出现在sizeof内部,因此大小是16. 11.a[3]仍然是第四行数组名,虽然它越界了。但我们知道sizeof并不会去访问这段空间,它只在乎里面的操作数的类型是什么。因此大小是16 2.大题(最后一题最难)第一题
答案:2,5 分析:
答案: 分析: 2.把p强制转换成unsigned long类型,由于这不是指针了,就变成普通的加法,答案是100001 3.强制转换成int*,加一跳过四个字节。因此为100004 第三题
答案: 分析: 2.ptr2有趣很多。它先把a强制转换成int,再加1,相当于对地址加1。1在内存中以大端形式存储。此时ptr2指向的值如图: 从内存中拿出来后变成02 00 00 00 注:这里写的都是16进制 第四题
**分析:**这道题有坑。二维数组的初识化是用大括号的。形式如下:
而这里用的是逗号表达式。实际上这个二维数组被初始化成了如下的样子: 第五题:
分析:
因此我们可以知道它们两对应的位置在哪。如图: 多提一句:对int类型的数组指针解引用后可以理解成类型int*。原先对数组指针加1是跳过一个数组,解引用后加1就是跳过一个整型 第六题:
分析: aa+1再解引用的类型本来就是int*了,这里的强制转换其实没必要。 答案是5,10 第七题:
分析: 第八题:(压轴题)
分析:
第二条式子(易错)
第三条式子
第四条式子
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 19:59:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |