2012-07-15 11 views

Odpowiedz

6

Łatwy przykład: leczyć pamięć jako tablica unsigned char

void *memory = malloc(1000); //allocate a pool of memory 
uint8_t *ptr = memory+10; 
*ptr = 1 //set an integer value at byte 10 
uint8_t i = *ptr; //read an integer value from the 10th byte 

Możesz używać liczb całkowitych też, ale wtedy trzeba zwrócić uwagę na temat ilości bajtów jesteś zachodzącego naraz.

+0

Czy można to zrobić z rzutowaniem pustego wskaźnika zamiast tworzenia "pośredniego" wpisanego wskaźnika? – dtech

+0

oczywiście używam pośredniej reprezentacji dla zachowania przejrzystości – ziu

3

tak, to „praca” Zakładam, że masz na myśli „jak mogę dereference/wykonać wskaźnik arytmetycznych na void*”? Nie możesz; musisz go rzucić, zwykle do char*, jeśli chcesz po prostu czytać fragmenty pamięci. Oczywiście, jeśli tak jest, po prostu zadeklaruj to jako char* na początek.

+0

Jestem zainteresowany czytaniem/pisaniem każdego typu, a nie tylko char. – dtech

+0

@ddriver: To nic nie zmienia. Musisz rzucić wskaźnik. Jak można się spodziewać dereferencji i/lub działania arytmetycznego, gdy typ jest nieznany? To nie ma sensu. Będziesz musiał podać dodatkowe informacje, aby wiedzieć, jaki jest podstawowy typ. –

4

Zasady są proste:

  • każdy typ wskaźnika (z wyjątkiem wskaźników funkcji) mogą być oddane do i od void *, bez strat.
  • Nie można wykonywać arytmetyki wskaźnikowej na pustych * wskaźnikach i nie można ich usunąć.
  • sizeof (char) równa się 1, z definicji; więc zwiększanie wskaźnika char oznacza "dodanie 1" do "surowej" wartości wskaźnika

Z tego można wywnioskować, że jeśli chcesz wykonać "surową" arytmetykę wskaźnika, musisz rzucić na iz char *.

Powiązane problemy