09. November 2026, 18:29
Du darfst mit dem sehr wohl rechnen, aber es wird nicht das sein was du dir vorstellst. zB:So, ich möchte also jetzt einen Zeiger um z.B. 5 Bytes erhöhen. Dann geht es so ja nicht:Code: [Auswählen]T *t = 0;Unter der Annahme, dass T ein Typ der Größe s ist, ist nach diesem Codestück t = 0 + 1 * s = s, d.h. es wird anstatt ein Byte weiterzugehen einmal s Bytes weitergegangen.
++t;
Wenn du wirklich bytes weitergehen möchtest, dann macht man das so:Code: [Auswählen]T *t = 0;wobei x die Anzahl der Bytes ist die du weiter möchtest.
t = (T*)((uintptr_t)t + x)
u32 *zeiger;
//<- hier wird der Wert von Zeiger festgelegt
zeiger += 5;zeiger = (u32*)((uintptr_t)zeiger + 5);error: ‘uintptr_t’ undeclared (first use in this function)
Wenn ich das richtig verstanden habe, würde in diesem Fall Zeiger um 5*32 Bit = 5*4 Bytes = 20 Bytes erhöht, oder?ja.
Sprich ich muss uintptr_t erst in der types.h eintragen. Nur als welchen Typen?Kommt offensichtlich auf die Architektur an für die du programmierst. Bei 32bit wohl uint32_t und bei 64bit wohl uint64_t.
Ah danke. Ich habe aber gesehen dass uintptr_t nicht in die types.h sondern in die stdint.h kommt. Aber wozu brauche ich dann eine types.h, wenn in der stdint.h schon solche Sachen wie int8_t, uint8_t etc. drin stehen? Und wann sollte ich die aus der types.h und wann die aus der stdint.h nehmen? Bzw. wann sollte ich eigentl. generell diese Typen nehmen? Also sollte ich z.B. bei meiner kprint "char *" oder "u8 *" oder "uint8_t *" verwenden?Wenn ich das richtig verstanden habe, würde in diesem Fall Zeiger um 5*32 Bit = 5*4 Bytes = 20 Bytes erhöht, oder?ja.ZitatSprich ich muss uintptr_t erst in der types.h eintragen. Nur als welchen Typen?Kommt offensichtlich auf die Architektur an für die du programmierst. Bei 32bit wohl uint32_t und bei 64bit wohl uint64_t.
Ah danke. Ich habe aber gesehen dass uintptr_t nicht in die types.h sondern in die stdint.h kommt. Aber wozu brauche ich dann eine types.h, wenn in der stdint.h schon solche Sachen wie int8_t, uint8_t etc. drin stehen? Und wann sollte ich die aus der types.h und wann die aus der stdint.h nehmen? Bzw. wann sollte ich eigentl. generell diese Typen nehmen? Also sollte ich z.B. bei meiner kprint "char *" oder "u8 *" oder "uint8_t *" verwenden?Es gibt Standards die dir sagen in welchen Headern welche (Typ-)Definitionen zu finden sind. Einer dieser Standards ist der C99 Standard (bzw. genauer: ISO/IEC 9899:1999, letzter Draft vor der Standardisierung hier) und ein anderer zu C99 kompatibler Standard wäre beispielsweise die Single UNIX Specification bzw. POSIX (siehe hier).
void kprint(char* msg);void kprint(int8_t* msg);uint64_t dummy;
uint8_t* zeiger;
...
zeiger = (uint8_t*)dummy;error: cast to pointer from integer of different size
zeiger = (uint8_t*)((uintptr_t)dummy);