Forum: Mikrocontroller und Digitale Elektronik Unterschied char* x und char *x


von M. Н. (Gast)


Lesenswert?

Hallo Leute. Habe mir einen C Code angeschaut und bin dabei auf die 
Bezeichnungen char* x und char *x gestoßen. Was ist der Unterschied? 
Letzteres legt soweit ich weiss einen Pointer auf ein char an.

x = 1024; setzt den Pointer auf Adtresse 1024
und
*x = 2; setzt die Speicherstelle 1024 auf 2.

aber was ist der andere "Ausdruck"?

Helft mir bitte.

Danke im voraus.

von Mark B. (markbrandis)


Lesenswert?

Ist das gleiche. Man muss freilich aufpassen, wenn man mehrere Variablen 
in einer Zeile deklariert.

char* x, y;

ist nicht äquivalent zu

char *x, *y;

von M. Н. (Gast)


Lesenswert?

Ok. Danke. Noch ne wichtige Frage:


     char string2[20]="red dwarf";
     char string1[20]="";
           strcpy(string1, string2);

Das hier kopiert string 2 in string 1. aber laut anleitung ist der 
Syntax der Funktion:

strncpy(char *s1, const char *s2);
Das würde ja bedeuten, dass ich die Adressen der Strings übergeben muss

also so:  strncpy(&string1, &string2);


Kann mir bitte jemand helfen. Schnall das nicht so wirklich....

von Peter II (Gast)


Lesenswert?

M. H. schrieb:
> Das würde ja bedeuten, dass ich die Adressen der Strings übergeben muss

machst du ja.

char string2[20]="red dwarf";  ist identisch mit  char* string2="red 
dwarf";

von M. Н. (Gast)


Lesenswert?

Vielen Dank. Jetz hat das ganze ne gewisse Logik :)

(Freu mich wie ein Schnitzel)

M.H.

von Klaus K. (klkl)


Lesenswert?

>      char string2[20]="red dwarf";
>      char string1[20]="";
string ist damit ein char[], das in c/c++ (fast) gleich einem char* ist.
>            strcpy(string1, string2);
>
> Das hier kopiert string 2 in string 1. aber laut anleitung ist der
> Syntax der Funktion:
>
> strncpy(char *s1, const char *s2);
Damit stimmt das dann auch.

Gruß Klaus

von klausr (Gast)


Lesenswert?

Also, du hast zwei Möglichkeiten:
  strcpy(string1, string2);
string1 und strin2 SIND bereits die Adressen!
Oder:
  strcpy(&string1[0], &string2[0]);
Liefert dir die Adresse des jeweils ersten Elements, also die des 
Strings.

Obacht: Du hast beim zweiten mal strncpy geschrieben! Man sollte auch 
strncpy verwenden, da man so angeben kann, wie viel Bytes maximal 
kopiert werden:
  char *strncpy(char *dest, const char *src, size_t n);

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:

> char string2[20]="red dwarf";  ist identisch mit  char* string2="red
> dwarf";

Nein. Den Test der ersten Version kann man überschreiben, den Text der 
zweiten (sollte) man nicht. Zudem besteht ein deutlicher Unterschied im 
Platzverbrauch.

von Torsten L. (bluehorn)


Lesenswert?

A. K. schrieb:
> Peter II schrieb:
>
>> char string2[20]="red dwarf";  ist identisch mit  char* string2="red
>> dwarf";
>
> Nein. Den Test der ersten Version kann man überschreiben, den Text der
> zweiten (sollte) man nicht. Zudem besteht ein deutlicher Unterschied im
> Platzverbrauch.

Das ist korrekt. Erklären sollte man das evtl. etwas genauer:

char string2[20];

reserviert zunächst einfach 20 Byte an Speicher (im RAM). Mit

char string2[20] = "irgendetwas";

wird dieser Speicher beim Programmstart noch initialisiert 
(hoffentlich). Dabei wird auch noch automatisch eine 0 hinter das letzte 
Zeichen gesetzt.

char *string2 = "irgendetwas";

reserviert Speicher für "irgendetwas" + 0-Byte. Das kann ggf. sogar im 
ROM liegen, weil es als Konstante verstanden wird. Zusätzlich wird 
Speicher für einen Zeiger darauf reserviert.

Somit kann der zweite Ausdruck in der Tat weniger Speicher brauchen:

char *string2 = "f";

reserviert nur Platz für einen Zeiger und eine Konstante "f", also 
wahrscheinlich 4 Bytes auf einem AVR.

von eProfi (Gast)


Lesenswert?

Man kann auch char*x schreiben.

von M. Н. (Gast)


Lesenswert?

ok. danke.

das hat mir sehr geholfen (auch wenn der code von einem pic32 ist)   :)

von Werner B. (werner-b)


Lesenswert?

Peter II schrieb:
> char string2[20]="red dwarf";  ist identisch mit  char* string2="red
> dwarf";

!!! NEIN !!!

Denn im Fall char* string2 = "red dwarf";  ist string2 eine Variable und 
ich darf später einen anderen Wert zuweisen. z.B. string2 = "abc"; oder 
string2++;

Das geht mit char string[20] = "red dwarf"; nicht, da hier string2 keine 
Variable ist, sonder der Name der Adresse des Array.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.