我在过去的关于 c 中指针的考试问题上遇到了麻烦,这是我从这个链接找到的,http://www.cl.cam.ac.uk/teaching/exams/pastpapers/y2007p3q4.pdf http://www.cl.cam.ac.uk/teaching/exams/pastpapers/y2007p3q4.pdf
问题是这样的:
一个 C 程序员正在与一个
小端机,8 位
一个字有 1 个字节和 4 个字节。这
编译器支持未对齐访问和
使用 1、2 和 4 个字节来存储 char,
分别是short和int。这
程序员写了以下内容
定义(右下)来访问
主存储器中的值(左下):
地址字节偏移量
----------0 --1-- 2-- 3
0x04 | 0x04 10 00 00 00
0x08 | 0x08 61 72 62 33
0x0c | 0x0c | 33 00 00 00
0x10 | 0x10 78 0c 00 00
0x14 | 0x14 08 00 00 00
0x18 | 0x18 01 00 4c 03
0x1c | 0x1c | 18 00 00 00
int **i=(int **)0x04;
short **pps=(short **)0x1c;
struct i2c {
int i;
char *c;
}*p=(struct i2c*)0x10;
(a) 写下以下 C 表达式的值:
**i
p->c[2]
&(*pps)[1]
++p->i
I get
**i == 0xc78
p->c[2] == '62'
++p->i == 0x1000000
我不明白第三个问题(&(*pps)[1]
),有人可以解释一下这里发生了什么吗?我知道 pps 指针已被取消引用,但随后运算符的地址已应用于该值。这不是就像询问常量的地址吗,例如如果我这样做
int i = 7;
int *p = &i;
&(*p) //would this mean address of 7??
预先感谢您的任何帮助。
The []
运算符优先于&
操作员。所以代码取消引用pps
获取数组的第一个元素short*
。由于这个元素也是一个指针,我们可以将它视为一个数组,并在它所指向的右侧查找该元素,wth[1]
。最后,我们获取该元素的地址。
注意到这一点可能会有用&p[i]
是相同的p + i
- 它给你一个指向元素的指针i
位置在哪里的右边p
指着。
中间值为:
pps == 0x1c
*pps == 0x18
&(*pps)[1] == *pps + 1 == 0x1A
(the +1
添加两个字节,因为它用在short*
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)