Hallo zusammen.
@Roberto
Ich will mal versuchen die Strings in C doch noch mal klarzustellen.
izaseba hat ja schon angekündigt, dass gerade bei der Parameterübergabe nur 16 Bit benötigt werden. Warum aber?
(Beim nächsten Beispiel bitte Variablen mit weniger Speicher benutzenCode:Beispiel von izaseba: #include<string,h> char puffer[30]; /*Hier passen max 29 Zeichen*/ const char eintext[]="noch was"; char nocheinpuffer[10]; Ergibt: Speicher- Speicher- adresse inhalt 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 n 31 o 32 c 33 h 34 35 w 36 a 37 s 38 NULL 39 40 41 42 43 44 45 46 47 48 Wofür werden "puffer", "eintext" und "nocheinpuffer" benötigt? In diesen Namen stehen 'nur' die Adressen der Speicherstellen in denen der eigendliche Inhalt vorhanden ist. Um diese Adressen aber selbst zu speicher, benötigen wir noch mehr Speicherplätze: 49 0 puffer ist hier und --> zeigt <-- auf 0*255 + 0 = Adresse 0 50 0 da puffer mit '[30]' gemacht wurde, 'gehört' ihm noch Adresse 29 51 0 eintext ist hier und --> zeigt <-- auf 0*255 + 30 = Adresse 30 52 30 eintext wurde mit '[]="noch was"' gemacht, geht also bis Adresse 38 53 0 nocheinpuffer ist hier und --> zeigt <-- auf 0*255 + 39 = Adresse 39 54 39 wie bei puffer nun bis Adresse 48 Was macht "strcpy(puffer,"Hallo Roberto");"? --> Erst mal müssen wir fragen wo steht "Hallo Roberto" im Speicher? Natürlich auch wieder in unserem Speicher. Also weitere Adressen: (Dürfen auch Adressen im ROM oder EEPROM sein) 55 H 56 a 57 l 58 l 59 o 60 61 R 62 o 63 b 64 e 65 r 66 o 67 NULL Das ist bei C nun einmal so. Basic kann nur eine begrenzte Anzahl Zeichen in einem String speichern, weil die Anzahl der Bytes vorne im Speicher der Variablen steht. Das sieht du nur nicht. Somit hat C schon wieder einen Vorteil, weil du BELIEBIG lange Strings speichern kannst. Hinten ist halt das NULL-Zeichen. Nun kann also die Funktion strcpy (??, ??) etwas machen. Was passiert? izaseba hat es schon gesagt: Die Zeiger (man spricht auch von Pointern) auf Speicherstellen werden als Parameter in die Funktion reingegeben. Welche Zeiger sind das? Natürlich die Zeiger auf Adressen. Hier also wird der Aufruf zu: strcpy (0, 55) <-- 0, weil puffer den Zeiger auf Adresse 0 hat <-- 55, weil "Hallo Roberto" den Zeiger auf Adress 55 hat. Das weiss der Kompiler, weil es keine Variable ist. Nun wird strcpy einfach folgendes machen: merke 55 in quelle merke 0 in ziel loop Nimm den Inhalt aus der Speicherstelle quelle und schreibe ihn nach ziel Prüfe, ob in Speicherstelle quelle ein NULL steht Wenn nein: erhöhe quelle um 1 erhöhe ziel um 1 gehe wieder an den Anfang von loop Wenn ja verlasse die loop ende loop Und schon sieht unser Speicher so aus: 00 H 01 a 02 l 03 l 04 o 05 06 R 07 o 08 b 09 e 10 r 11 t 12 o 13 NULL 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 n 31 o 32 c 33 h 34 35 w 36 a 37 s 38 NULL 39 40 41 42 43 44 45 46 47 48 49 0 puffer 50 0 51 0 eintext 52 30 53 0 nocheinpuffer 54 39 55 H 56 a 57 l 58 l 59 o 60 61 R 62 o 63 b 64 e 65 r 66 o 67 NULL)
Nocheinmal: Es werden hier also keine Variablen verschoben/kopiert oder Sonstiges. Es werden nur Inhalte aus Speicherstellen von a nach b kopiert.
Von wo nach wo sagt man der Funktion. Und damit man sich als Programmierer nicht die Speicherstellen selber merken muss, nimmt man dafür Variablen, die selber NUR die Adressen speichern wo der Daten-Inhalt deiner Variablen im Speicher steht. Diese Variablen nennt man Pointer-Variablen. Ihr Inhalt zeigt auf die Daten um die es dir/dem Programmierer geht.
Alle String-Variablen in C arbeiten so.
Vorsicht: Eine Variable in der Form
char zeichen = 'x';
ist KEIN String. Dies ist nur ein einzelnes Zeichen, welches nur genau ein Byte benötigt, und auch NICHT mit NULL beendet wird.
Ich hoffe, dass dies etwas geholfen hat.







Zitieren

Lesezeichen