我在上一篇关于c的指针问题上遇到了麻烦,我从这个链接中找到了这个问题, http://www.cl.cam.ac.uk/teaching/exams/pastpapers/y2007p3q4.pdf
问题是:
AC程序员正在使用一个小端机器,一个字节为8位,一个字为4个字节.编译器支持未对齐访问,并使用1,2和4字节分别存储char,short和int.程序员编写以下定义(右下方)来访问主存储器中的值(左下方):
地址字节偏移
--------- 0 --1-- 2-- 3
0x04 | 10 00 00 00
0x08 | 61 72 62 33
0x0c | 33 00 00 00
0x10 | 78 0c 00 00
0x14 | 08 00 00 00
0x18 | 01 00 4c 03
0x1c | 18 00 00 00
int **i=(int **)0x04;
short **pps=(short **)0x1c;
struct i2c {
int i;
char *c;
}*p=(struct i2c*)0x10;
Run Code Online (Sandbox Code Playgroud)
(a)记下以下C表达式的值:
**i
p->c[2]
&(*pps)[1]
++p->i
Run Code Online (Sandbox Code Playgroud)
我明白了
**i == 0xc78
p->c[2] == '62'
++p->i == 0x1000000
Run Code Online (Sandbox Code Playgroud)
我不明白第三个问题(&(*pps)[1]),有人可以解释一下这里发生了什么吗?我理解pps指针已被解除引用,但随后运算符的地址已应用于该值.这不就像要求一个常数的地址,例如,如果我这样做
int i = 7;
int *p = &i;
&(*p) //would this mean address of 7??
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助.
该[]运营商优先于&运营商.所以代码是解除引用pps以获取数组的第一个元素short*.由于这个元素也是一个指针,我们可以将它视为一个数组,并在元素的一个位置向上查找它所指向的位置[1].最后,我们采用该元素的地址.
这可能是有用的注意,&p[i]是一样的p + i-它可以让你的指针元素i位置到右侧p点.
中间值是:
pps == 0x1c
*pps == 0x18
&(*pps)[1] == *pps + 1 == 0x1A
Run Code Online (Sandbox Code Playgroud)
(+1添加两个字节,因为它用于a short*)
| 归档时间: |
|
| 查看次数: |
3612 次 |
| 最近记录: |