Zrozumieć wskaźniki...

0

W pewnym tutorialu natrafiłem na zapis:

dataPos    = *(int*)&(header[0x0A]);
imageSize  = *(int*)&(header[0x22]);
width      = *(int*)&(header[0x12]);
height     = *(int*)&(header[0x16]);

I pomyślałem, czy nie można zastąpić tego zapisem:

dataPos    = header[10];
imageSize  = header[34];
width      = header[18];
height     = header[22];

Nie wiem czy dobrze rozumiem działanie systemu wskaźników, więc chciałbym zapytać się, czy mam dobry tok myślenia:

1. Start: "*(int*)&(header[10])"

2. Operator "&" zwraca adres do "header[10]".

3. "(int*)" tworzy czasowy wskaźnik przechowujący adres "&header[10]".

4. Operator "*" zwraca wartość zapisaną pod adresem "(int*)&(header[10])".

5. Na końcu otrzymuję wartość "header[10]".
1

jeśli header jest tablicą int, to możesz, jeśli nie to możesz zrobić to zastąpić: &(header[0x0A]) z (header + 0x0A).

Zauważ różnicę np.:
char arr[] = {1,2,3,4,5};
w przypadku arr[1] dostaniesz 2, w przypadku *((int*)(arr + 1)) dostaniesz przekonwertowane ostatnie 4 bajty do int 0x02030405 albo 0x05040302 w zależności od endianess.

O pointerach należy myśleć tak: jest to adres w pamięci (najczęściej liczba całkowita nieujemna 64 lub 32 bitowa). Typ pointera mówi Ci o tym ile bajtów za miejscem wskazywanym przez wskaźnik należy zinterpretować jako dany typ.

1 użytkowników online, w tym zalogowanych: 0, gości: 1