Unterschied char* x und char *x

Gast #2411087
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.
Gast #2411094
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....
#2411103
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
Gast #2411106
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);
#2411195
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.
#2411643
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren