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.