Хитрый указатель вопрос - PullRequest
13 голосов
/ 29 марта 2011

У меня проблемы с прошлым экзаменационным вопросом по указателям в c, который я нашел по этой ссылке, http://www.cl.cam.ac.uk/teaching/exams/pastpapers/y2007p3q4.pdf

Вопрос такой:

Программист переменного токаработа с машиной с прямым порядком байтов с 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??  

Заранее спасибо за любую помощь.

Ответы [ 4 ]

7 голосов
/ 29 марта 2011

Оператор [] имеет приоритет над оператором &.Таким образом, код разыменовывается pps, чтобы получить первый элемент массива short*.Поскольку этот элемент также является указателем, мы можем рассматривать его как массив и искать элемент на одну позицию справа от того, на что он указывает, wth [1].Наконец, мы берем адрес этого элемента.

Может быть полезно отметить, что &p[i] совпадает с p + i - он дает вам указатель на позиции элемента i справа отгде p указывает на.

Промежуточные значения:

pps == 0x1c
*pps == 0x18
&(*pps)[1] == *pps + 1 == 0x1A

(+1 добавляет два байта, так как он используется в short*)

1 голос
/ 29 марта 2011

pps - указатель на указатель на короткую позицию,

, что означает, что *pps - указатель на короткую позицию (или массив шорт),

(*pps)[1] аналогично*(*pps + 1) [арифметика указателей],

и &(*(*pps + 1)) - это адрес *(*pps+1),

или, другими словами - (*pps+1) (который является указателем на short).

1 голос
/ 29 марта 2011

Выражение разбирается как &((*pps)[1]);pps рассматривается как указатель на массив, вы обращаетесь к первому элементу этого массива, на который указывает указатель, а затем берете адрес этого элемента.

0 голосов
/ 29 марта 2011

pps - указатель на указатель.Это разыменование pps.Так что теперь у вас есть указатель.Поскольку массивы - это просто указатели, вы затем используете pps в качестве массива.

Это то же самое, что и:

short ps[2] = {0x0001,0x034c};
short **pps = &ps;

, поэтому результат равен: 0x034c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...