🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。
前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
题目
已知 static int a[]={5,4,3,2,1},*p[]={a+3,a+2,a+1,a},**q=p
,则表达式 *(p[0]+1)+**(q+2)
的值是( )。
A. 5 B.4 C. 6 D.7
解说
刚开始看到这个题目,是不是有点懵?感觉自己学的是假的指针,不要慌!
接下来看我的方法:
首先要催眠自己记住:*是从地址中取值,&是获取值的地址;*是从地址中取值,&是获取值的地址;*是从地址中取值,&是获取值的地址…
然后我们假设有个内存条(我的独门秘诀,对你分析题目一定有帮助!不要怕写的麻烦,做出来一定会让你骄傲一秒钟!):
内存地址 | 内容 |
---|---|
0x0100 | 5 |
0x0101 | 4 |
0x0102 | 3 |
0x0103 | 2 |
0x0104 | 1 |
然后又知道直接使用变量 a 的话,就会获取数组第一个值的地址,即 a = 0x0100
;
接下来题目赋值了一个指针数组,继续给我们的内存条加内存:
内存地址 | 内容 |
---|---|
0x0100 | 5 |
0x0101 | 4 |
0x0102 | 3 |
0x0103 | 2 |
0x0104 | 1 |
0x0200 | 0x0103 |
0x0201 | 0x0102 |
0x0202 | 0x0101 |
0x0203 | 0x0100 |
新增的就是指针数组 p 的内存地址。
然后看到 **q=p
,一个 * 就让我们很慌了,两个 * 怎么办?
不要慌!遇到问题先发个朋友圈 !
首先我们要理解一下这个 p ,他是存指针变量的数组,所以他存的数值都是指针地址,而他存的是另一组指针地址。
然后我们来转换一下,我们应该熟记:
*address = value
address = &value
对吧?
所以此处的 **q=p
就可以转写为 *q=&p
,现在再用中文说一遍:
指针 q 是变量 p 的地址,所以此处应该是 q = 0x0200
对吧?
然后我们将所有内存地址与变量的对应关系代入总的算式:
*(p[0]+1)+**(q+2)
= *(a+3+1)+**(0x0200+2)
= *(0x100+4)+**(0x0202)
= *(0x0104)+**(0x0202)
= 1+*(0x0101)
= 1+4
= 5
所以选 A !
没毛病啊!
结束语
我觉得经过这解说,整个题目变得十分清晰了。
如果我的解说对你有帮助,不要忘了 关注、点赞、收藏 哦~