棘手的指针问题

13 c pointers

我在上一篇关于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)

在此先感谢您的帮助.

Aas*_*set 7

[]运营商优先于&运营商.所以代码是解除引用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*)

  • 那个向我投降的人请指出我的错误,以便我能纠正它/他们吗? (3认同)