Pytanie o wskaźniki
Ostatnio zmodyfikowano 2017-04-16 11:36
Szustarol Temat założony przez niniejszego użytkownika |
Pytanie o wskaźniki » 2017-04-10 10:31:16 Załóżmy, że jestem w trybie 64 bitowym i mam dostęp do całej pamięci. Mam zmienne zapisane na adresie 0x1000 zm1 - 4 bajty - dword zm2 - 1 bajt - byte zm3 - 2 bajty - word Chcę za pomocą wskaźnika się do tego dostać. Czy utworzyć char pointer, i zwiększać go o 4, następnie 1 aby dostać sie do każdej wartości? To brzmiało by rozsądnie, natomiast czy char* będzie 64 bitowy tak aby zmapować mi np. 8 GB pamięci? Jeśli tak to czy char * c = (char*)0x1000; int value = *(int*)c;
wyciągnie mi 4 bitową zawartość zmiennej? |
|
jankowalski25 |
» 2017-04-10 17:52:47 Czy utworzyć char pointer, i zwiększać go o 4, następnie 1 aby dostać sie do każdej wartości? |
Dlaczego zakładasz, że sizeof( char ) == 1 ? W wielu przypadkach tak jest, ale bezpieczniej użyć typów z #include <cstdint>. czy char* będzie 64 bitowy |
Sprawdź przez sizeof( char * ) , jeśli rzeczywiście tego potrzebujesz. czy
char * c =( char * ) 0x1000; int value = *( int * ) c; wyciągnie mi 4 bitową zawartość zmiennej? |
Jeśli sizeof( int ) == 4 , to pewnie tak, ale jak wspomniałem wyżej, lepiej skorzystaj z #include <cstdint> (ewentualnie #include <stdint.h> jeśli piszesz w C). Dopisano:Zakładam, że chodziło o cztery bajty, a nie bity. Jak chcesz wyciągać poszczególne bity, to możesz pobrać jeden bajt i wykonać na nim podstawowe operacje logiczne. |
|
mokrowski |
» 2017-04-11 04:37:36 Dobrze zakładasz że char to 1 bajt. Zawsze. https://isocpp.org/wiki/faq/intrinsic-types#sizeof-char
Niemniej jednak stosowanie <cstdint> pozwoli wyrażać jaśniej większe wartości ilości bajtów.
Wskaźnik na char, czyli char * zawsze będzie wskazywał na 1 bajt w pamięci. Czy jednak będzie to cała przestrzeń adresowa, czy będzie ciągła i czy do każdego przedziału pamięci dostaniesz się w trybie rw, to już pytanie o konkretną platformę systemową. |
|
Rashmistrz |
» 2017-04-13 14:49:37 Jeśli tak to czy wyciągnie mi 4 bitową zawartość zmiennej? |
Bajtową tak, bitową nie. Manipulujesz tam tylko meta danymi wskaźnika, adres pozostaje ten sam, który wskazuje na pierwszy bajt zmiennej w pamięci. Tylko pamiętaj o kolejności bajtów na maszynie na którą programujesz. Jeśli w pamięci pod adresem są bajty AB CD EF 12. to odczytany char będzie 0xAB, a int 12 EF CD AB, więc tak trochę uważaj. Dobrze wiesz co robisz. Programik dla Ciebie: #include <iostream> int main() { void * ptr =( void * ) 0x1000; int & zm1 = *( int * ) ptr; char & zm2 = *(( char * ) ptr + 4 ); short & zm3 = *( short * )(( char * ) ptr + 5 ); std::cout <<( void * ) & zm1 << ' ' <<( void * ) & zm2 << ' ' <<( void * ) & zm3; }
czy char* będzie 64 bitowy tak aby zmapować mi np. 8 GB pamięci? |
Well... Każdy wskaźnik ma taki sam rozmiar. Niektóre systemy są 64bitowe, a mogą używać 32 bitowych wskaźników. x86 z PAE pozwala na zaadresowanie większej ilości pamięci niż 4GB... Więcej nie pamiętam. :F |
|
Szustarol Temat założony przez niniejszego użytkownika |
» 2017-04-16 11:36:31 Wielkie dzięki już wszystko jasne :) |
|
« 1 » |