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?
Code:
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
(Beim nächsten Beispiel bitte Variablen mit weniger Speicher benutzen )
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.
Lesezeichen