【发布时间】:2011-03-28 22:45:57
【问题描述】:
我在从这个链接中找到的关于 c 指针的过去考试问题中遇到了问题, http://www.cl.cam.ac.uk/teaching/exams/pastpapers/y2007p3q4.pdf
问题是这样的:
一个 C 程序员正在使用一个 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;
(a) 写下下列 C 表达式的值:
**i
p->c[2]
&(*pps)[1]
++p->i
我明白了
**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??
提前感谢您的帮助。
【问题讨论】:
-
他们为什么要问这些东西而不是教有用的、干净的编程?
-
我很高兴其他人也这么认为。我还要感谢大家为提供快速简洁的答案所做的努力。这对我来说更清楚。