Hi Christian,
sehr vielen Dank. Jetzt bin ich nochmal ein Stück schlauer geworden. Gut erklärt!
Was 1UnitedPower veranschaulichen wollte, war die Tatsache, dass bei Pointer-Arithmetik die Anzahl der Bytes, die ein
*(ptr+1)
„nach vorne gehen“ muss, vom Compiler ausgerechnet wird anhand der Typen-Informationen. Einfaches Beispiel:
ach soo. Ja, das hatte ich sowieso angenommen. Aber ist klar jetzt
#include <stdio.h>
int main(void) {
int ifield[] = {1,2};
char cfield[] = {'a','b'};
printf("address of ifield and ifield+1: %p %p\n", ifield, ifield+1);
printf("address of cfield and cfield+1: %p %p\n", cfield, cfield+1);
return 0;
}
>
> Beispielhafter output:
>
> ~~~
> address of ifield and ifield+1: 0x7fff2ea67890 0x7fff2ea67894
> address of cfield and cfield+1: 0x7fff2ea67880 0x7fff2ea67881
>
Wie du sehen kannst, ist die Differenz der beiden Integer-Pointer 4 (0x7fff2ea67890 - 0x7fff2ea67894 = 4) und die Differenz der beiden Char-Pointer 1 (0x7fff2ea67880 - 0x7fff2ea67881 = 1), und das obwohl wir bei beiden Arrays nur 1 addiert haben.
super erklärt, danke. Das ist verstanden.
Wie ist denn das dann eigentlich mit uft8 bzw. Mehrbytekodierungen? Ist die interne Größe von
char *ptr = 'ä'; 1 Byte, egal wie das Dokument kodiert ist?Das fliegt dir um die Ohren:
int main(void) {
char c = 'ä';
return 0;
}
zum Glück! Ich war schon etwas verwundert wegen den 2 Bytes...
> Ein Byte kann halt nicht mehrere Bytes aufnehmen :-) Du musst das als char-Array handhaben:
eben, eben. Wie gesagt, etwas irritiert gewesen.
> C kennt halt keine Zeichen, sondern nur Bytes. Insofern ist der Datentyp `char` natürlich auch irreführend allerdings halt auch der Zeit geschuldet, in der C entstanden ist.
auch hier muss man immer noch etwas umdenken, aber grundsätzlich ist mir das jetzt klar. Ein paar Übungsprogramme, dann sollte das gefestigt sein, hoffe ich.
Danke euch allen!