Mechthild: C - Zeigerfrage Array

Beitrag lesen

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!