2015-10-14 2 views
2

Предположим, у вас есть 16-разрядная машина с 65536 байт памяти. Интс - 2 байта. Предположим, что переменные помещаются в память смежно в том порядке, в котором они закодированы, начиная с адреса памяти 0x250. С учетом следующего сегмента кода:Устройства памяти и указатели

int x = 30; 
int y = 50; 
int *px = &x; 
int *py = &y; 

printf("a) %x\n", px); 
printf("b) %x\n", py); 

px = py; 
printf("c) %d\n", *px); 
printf("d) %x\n", &px); 

x = 88; 
y = 14; 

printf("e) %d\n", *px); 
printf("f) %d\n", *py); 

Дайте выходные данные каждой инструкции printf.

Говорят, что адреса памяти распределяются в порядке возрастания.

Я получил

a) 252 
b) 254 
c) 30 
d) 250 
e) 88 
f) 14 

ли это правильно?

+0

Это домашнее задание? – ouah

+0

Каждый ответ, который вы указали выше 250, неверен. Они * могут * быть правильными, если вы включите префикс '0x', указав, что они шестнадцатеричные. –

+0

Домашние вопросы разрешены, если вы показываете свои собственные усилия и где вы застреваете. Люди с большей вероятностью дают намеки, чем решения домашней работы, чтобы поощрять обучение. –

ответ

4

Предположим, что переменные помещаются в память смежно в порядке, они кодируются, начиная с адреса памяти 0x250

Давайте следовать намек nneonneo, и «в качестве первого прохода, просто выделить переменные адреса просто так что вы знаете, где все ».

Это должно начать Вас на правой ноге:

int x = 30;    // &x = 0x250 
int y = 50;    // &y = 0x252 
int *px = &x;    // &px = 0x254 
int *py = &y;    // &py = 0x256 

Теперь немного инструктивных:

printf("a) %x\n", px); // These both print the *value* of the pointers 
printf("b) %x\n", py); // themselves (in other words, the address to which 
          // they point). 
          // Note: they're printed in hexadecimal 
          // (unfortunately with no prefix). 

px = py;     // The *value* of py is assigned to px. 
          // Now they both point to the same thing. 


printf("c) %d\n", *px); // This "de-references" px. In other words, it 
          // reads the value at the address px points to. 


printf("d) %x\n", &px); // This prints the *address* of the pointer px. 
          // Hint: can this change during program execution? 

x = 88;     // Simple integer assignments 
y = 14; 

printf("e) %d\n", *px); // Same logic as c) 

printf("f) %d\n", *py); // Same logic as c) 

Ответы (для тех, кто хочет проверить свои ответы, или мошенники):

a) 250
b) 252
c) 50
d) 254
e) 14
f) 14

+0

Кроме того, OP должен быть осторожным относительно того, что является десятичным значением, и что является шестнадцатеричным значением. –

+0

Режиссер на ОП. Отредактировал мой предыдущий комментарий для ясности. –

+0

Ницца. Узнал, как публиковать «текст спойлера»! – kaylum

Смежные вопросы