Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Anfängerfrage: Unterschied zwischen char* s und char s[]

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
22.06.2003, 14:15 Uhr
hOk



Hi Leute,

ich habe eine bestimmt ganz doofe Frage,
und zwar sehe ich häufig diese beiden Definitionen:

1.) char* s = "Dies ist ein String";
2.) char s[] = "Dies ist ein String";

Die erste Definition ist doch ein Zeiger, aber das macht für mich
noch keinen Sinn, worauf zeigt der denn?

Die zweite Definition ist ein Char-Array, oder?

Sind die beiden Definition gegeneinander austauschbar?


netten Gruß, hOk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.06.2003, 14:47 Uhr
Re-Animator



hallo hOK,

also wenn ich mich nicht irre ist

C++:
char* s = "Dies ist ein String";


ein Zeiger auf den ersten Buchstaben der Zeichenkette (string).
Also in dem Fall auf "D", bin mir aber nicht ganz sicher?



C++:
char s[] = "Dies ist ein String";

diese Anweisung schreibt in ein Array Feld den oberen String rein.

mit z.B

while (s [n]);
n++

kannst du jeden Buchstaben des char array durchlaufen zählen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.06.2003, 14:55 Uhr
Pablo
Supertux
(Operator)


char* s = "Das ist ein String"; ist ein Zeiger auf ein Array char s[18] = {'D', 'a', 's', ' ', 'i', 's', 't', ' ', 'e', 'i', 'n',' ', 'S', 't', 'r', 'i', 'n', 'g'};
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 22.06.2003 um 14:57 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.06.2003, 15:17 Uhr
~0xdeadbeef
Gast


Da liegt ihr beide falsch. Ich möchte noch eine dritte Deklaration mit reinnehmen, weil es für die Erklärung hilfreich ist:

C++:
char *const zeiger_konstante = "bli";


Dann ist

C++:
char s[] = "test";
char *t = &s[2]; /* legal */
char *const u = &s[2]; /* legal */
char v[] = &s[2]; /* illegal. (invalid initializer) */

++t; /* legal */
++u; /* illegal (u ist konstant) */
++v /* illegal (inkompatible Typen) */


Die Zeigertypen sind, denke ich, selbsterklärend. Ein Array ist im Grunde ein konstanter Zeiger, der mit einem Speicherbereich initialisiert werden muss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.06.2003, 12:54 Uhr
hOk



Hallo, vielen Dank für eure Hilfe,
mir ist schon einiges klarer geworden.

Eines will aber immer noch nicht so ganz
in meinen Kopf:

C++:
char* c;


Würde ich lesen als: Deklariert Char-Zeiger: "c"
Der Wert von "c" sollte also eine Adresse sein, aber:

C++:
c = "Zeichenkette";


...weist doch "c" ein Char-Feld zu, warum funktioniert
das?
Gibt "Zeichenkette" automatisch seine Adresse zurück?

nette Grüße, Holger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.06.2003, 13:14 Uhr
virtual
Sexiest Bit alive
(Operator)


@hOk
Ja, kann man so ausdücken.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.06.2003, 13:34 Uhr
ao

(Operator)


@hOk:
So ähnlich. Deine Frage ist ziemlich global, und ich denke, du bist mit einem einschlägigen Kapitel aus einem guten Fachbuch besser bedient als mit der unvollständigen Antwort, die ich hier mal eben eintippen könnte.

Das Thema Arrays, Pointer und Strings ist schon von vielen kompetenten (oder auch weniger kompetenten) Leuten beschrieben worden. Die weniger kompetenten Beschreibungen, wo so Sätze drin stehen wie "Ein Pointer ist ein Array" haben denn auch zu den vielen Mißverständnissen beigetragen.

Buchtipp: Kernighan & Ritiche: "The C Programming Language", zweite Auflage. Titel der deutschen Ausgabe: "Programmieren in C". Sollte in jeder guten Bibliothek zu haben sein. Wenn du C (nicht C++) lernst, ist es auf keinen Fall eine schlechte Idee, das Buch zu erwerben.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.06.2003, 14:37 Uhr
hOk



Wunderbar, ich danke euch vielmals,
jetzt hat es endlich Klick gemacht.

Das Buch werde ich mir auf jeden Fall
mal ausleihen.
Ich habe ein Anfängerbuch, dass erklärt
sowas leider nicht, und "Die C++ Programmiersprache",
doch das ist im Moment für mich noch ein
bischen zu Steil von der Lernkurve.

netten Gruß, hOk


C++:
#include <iostream>
using namespace std;


int main()
{
    // Definition eines Char-Arrays
    char c1[] = "Zeichenkette";
    //
    // c1 ist die Adresse von c1[0]
    cout << bool(&c1[0] == c1) << endl; // 1
    //
    // strlen zählt die Zeichen bis Zero-Terminator
    cout << strlen(c1) << " " << strlen(&c1[0]) << endl; // 12 12
    //
    // Definition eines Pointers auf das Char-Array "c1"
    char* pC1 = c1;
    //
    // Die Adressen sind identisch, daher
    cout << bool(pC1 == c1) << " " << bool(pC1 == &c1[0]) << endl; // 1 1
    //
    // Definition eines Pointers auf ein Char-Array-Literal
    char* pC2 = "Zeichenkette";
    //
    // Vergleich der Pointer ergibt false(andere Adresse)
    cout << bool(pC1 == pC2) << endl; // 0
    //
    // Vergleich der Werte(Dereferenzierung):
    cout << bool(*pC1 == *pC2) << endl; // 1
    cout << bool(*pC1 == *c1) << endl; // 1
    //
    // Ein Char-Array-Literal gibt die Adresse des ersten Elements zurück,
    // daher ist:
    cout << bool(*(&("Zeichenkette")[0]) == *("Zeichenkette")) << endl; // 1
    //
    return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.06.2003, 14:42 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
hOk postete

C++:
    [...]
    // Ein Char-Array-Literal gibt die Adresse des ersten Elements zurück,
    // daher ist:
    cout << bool(*(&("Zeichenkette")[0]) == *("Zeichenkette")) << endl; // 1
    //
    return 0;
}



Nein. Das ist nicht garantiert. Du unterstellst, daß der Compiler so intelligent ist und sich anschaut, ob die beiden Zeichenketten identisch sind und daher nur ein Array für die Zeichenkette anlegt. Dies machen zwar eine reihe von Compilern (ist ja auch legetim), aber es ist kein Muß. Manche Compiler geben hier eine 0 raus, was auch legetim ist.
Gleiches gilt für die beiden Ausgaben zuvor.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 23.06.2003 um 14:43 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.06.2003, 15:09 Uhr
hOk



Ah danke, aber:

C++:
*(&("Zeichenkette")[0])
und
C++:
*("Zeichenkette")

dereferenzieren, und stellen somit den Wert: "Z" dar.
Daher sollte doch
C++:
bool(*(&("Zeichenkette")[0]) == *("Zeichenkette"))
immer wahr werden, oder?
grüße, hOk

PS.: Jetzt bin ich wieder verwirrt...;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: