Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pytanie o wskaźniki

Ostatnio zmodyfikowano 2017-04-16 11:36
Autor Wiadomość
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?
P-160045
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
C/C++
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.
P-160049
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ą.
P-160056
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:
C/C++
// Example program
#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
P-160104
Szustarol
Temat założony przez niniejszego użytkownika
» 2017-04-16 11:36:31
Wielkie dzięki już wszystko jasne :)
P-160184
« 1 »
  Strona 1 z 1