Przeglądam mój podręcznik i jestem nieco zdezorientowany, jeśli chodzi o kod, który tam jest. W jednej części, są one wykonywaniu arytmetyki wskaźników w następujący sposób:void * vs. char * wskaźnik arytmetyczny
void* bp;
...
bp = (void*)((char*)(bp)+16);
...
ale później, to należy wykonać następujące czynności:
void* bp;
...
bp = bp+16;
...
czuję się jak powinny one być dwie różne rzeczy, ale oni traktują to tak samo. czuję się w ten sposób, ponieważ, na przykład, jeśli było zrobić dostępu do tablicy (na tablicy liczb całkowitych na przykład), to zrobi następujące
int* a = malloc(n*sizeof(int));
...
q = *(a+1);
...
w tym przypadku, nie mam dostępu do następnego 4 bajty w tablicy całkowitej, a nie kolejny bajt? Podobnie czuję, że jeśli mam pustkę * a, to * (a + 1) powinno być następnymi 4 bajtami ... A może tak nie jest? Dziękuję.
Ten drugi przykład nie powinien się kompilować. –
@OliCharlesworth: Nie skompiluje (lub przynajmniej wyśle ostrzeżenie), jeśli kompilujesz w trybie zgodności. gcc nie jest domyślnie zgodny i implementuje 'void *' arytmetyczną jako rozszerzenie. –