2016-12-10 5 views
3

Я не очень хорошо разбираюсь в сценариях на C++. Я попытался узнать больше о следующих назначениях переменных без успеха. Пожалуйста, объясните их или дайте мне источник для изучения подобных заявлений.Нужна помощь в понимании заданий переменных указателя

rand_seed = *(int*)input_buffer_ptr; 
moving_input_ptr = (BYTE*)((int*)input_buffer_ptr + 1); 
+0

Первое выражение довольно просто: извлеките первый элемент указателя 'input_buffer_ptr' после' int * 'cast. «Rand_seed» должен быть «int». –

ответ

2

(Учитывая, что int 4 байта)

Imagine ОЗУ в виде длинной строки байт (потому что):

RAM: .... [8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit] .... 

и SOME_TYPE* как указатель на некоторых байтах:

.... [8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit] .... 
     ^
     input_buffer_ptr 

int* означает, что вы обрабатываете данные под этим p ointer как целое число (число размером 4 байта)

Так что если у вас есть указатель SOME_TYPE* input_buffer_ptr

(int*)input_buffer_ptr; // casts this pointer to int*, 
    //so now you treat data under this pointer as 4 bytes integer 

затем:

*(int*)input_buffer_ptr; // operator * before pointer gets data under 
      //that pointer, in this case, integer (4 bytes). 

Так rand_seed является целым числом и имеет значение:

.... [8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit] .... 
      |  random_seed  | 

Затем:

 (int*)input_buffer_ptr + 1 
// ^     ^
// casting to int*  moving pointer to size of int (4 bytes) 

Итак:

.... [8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit][8bit] .... 
           ^
         ((int*)input_buffer_ptr + 1) 

И потом:

(BYTE*)((int*)input_buffer_ptr + 1); 
//^
// casting pointer to BYTE*, so it points to the same place 
// but now treated as one byte pointer. 

так что если вы попытаетесь это сделать:

BYTE a = *(BYTE*)((int*)input_buffer_ptr + 1); 

вы получите одну переменную байт со значением:

+0

@John Kugelman, большое спасибо за комментарий. – Factor

+0

Большое спасибо за подробный ответ @Yuhenhen Kuzmovych. – Factor

+0

Примечание: это неопределенное поведение (строгое нарушение псевдонимов), если буфер не был первоначально записан через 'int'. –

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