Speicheradressierung mit void*
-
void* ptr2 = (void*)((int*)ptr)+pos);
Der code setzt den pointer auf den um pos ints
erhöhten Wert. C-Anfänger will aber um pos bytes erhöhenvoid* ptr2 = (void*)((byte*)ptr)+pos)
-
Und byte heisst in C char.
-
Gibt es denn in C keinen byte-Typ?
-
Doch, char.
-
Hallo zusammen,
void* ptr2 = (void*)((int*)ptr)+pos);
Dass der Stern beim void gefehlt hat sehe ich ein.
Und wofür ist der beim int? Bei mir funktioniert es auch ohne?
Ich schätze mal, mir können da Addressinformationen verloren gehen, oder?
Just for interest: Bei allen Maschienen oder "nur" bei 64bit?
Der Stern ist kein Aufwand, nur zum Verständnis.Dass &(ptr[pos]) für char* geht, wußte ich auch, deshalb mal ne andere
Frage: Verwendet ihr in der Regel char* statt void* damit sowas schneller
geht (würde mich wundern) oder war das nur ne Anmerkung?Gruß,
*C-Anfänger*
-
Das dürfte nicht gleich sein:
void* ptr2 = (void*)((int*) ptr)+pos);
Hierbei wird ptr als Zeiger auf einen int interpretiert der
schließlich um 4 (Speicherplätze für ints) erhöht wird.Also ist ptr = 1000 dann ist ptr2 = 1000+4*sizeof(int) (meist 1016)
void* ptr2 = (void*)((int) ptr)+pos);
Hier wird ptr als reiner int interpretiert zu dem 4 addiert wird.
Also ist ptr = 1000 dann ist ptr2 = 1000+4 = 1004
-
Wozu so kompiliziert mit so vielen (für C) unnötigen Cast Operationen?
Einfach so:
void *ptr2 = ptr1 + pos;
-
Das geht?
pointer-Arithmetik ist doch definiert
pointer +- inti = (pointer-Typ) (int) ptr + inti*sizeof(Typ auf den Pointer zeigt).
und sizeof(void) ist doch gar nicht definiert.
-
ja, das geht. C macht implzit casten und stellt automatisch die Zeier auf die richtigen Stelle:
#include <stdio.h> int main(void) { int array[] = {0,1,2,3,4,5,6}; int pos = 4; int *zeiger = array; void *ptr = zeiger + pos; zeiger = ptr; printf("%d\n", *zeiger); return 0; }
supertux@supertux:~> gcc -otest test.c -ansi -std=c99 -Wall supertux@supertux:~> ./test 4
-
SG1 schrieb:
Und byte heisst in C char.
das ist muss aber kein vorzeichenloser 8-bit wert sein (was ja die meisten als 'byte' beteichnen)