kostenloser Webspace werbefrei: lima-city


Zeiger auf Zeiger? oder was?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    moglie

    moglie hat kostenlosen Webspace.

    Wenn man schreibt:

    char **irgendwas;

    ist das ein Zeiger auf einen Zeiger? (Kann ich mir nicht vorstellen)
    Wenn nicht, was ist es dann?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 0******a

    Doch du hast recht. Das ist ein Zeiger auf einen Zeiger. Im ersten Moment ist das bisschen verwirrend, aber es hat durchaus seine Berechtigung.
    Erstmal ein kleiner Exkurs zum besseren Verst?ndnis:
    char * pc;
    char ac[10];

    pc = ac;
    Ist diese Zuweisung korrekt?! Ja, denn ac ist ebenfalls ein Zeiger auf char. Der Unterschied zwischen ac und pc ist, das bei der Deklaration von ac bereits automatisch Speicher (10 Bytes) reserviert wird und das diese 10 Bytes im Speicher direkt nebeneinander liegen (je nach System ist es wirklich so oder das Speichermanagement des Systems gaukelt es uns vor). Weiterhin wird bei der Deklaration von ac ein Speicherbereich von 4 Bytes (zumindest auf 32-Bit Systemen, bei 16ern sinds 2 Byte, bei 64ern 8 Byte) f?r die Variable ac selbst bereitgestellt. Im Gegensatz dazu wird bei der Variable pc nur der Speicherbereich von 4 Bytes f?r pc selber bereitgestellt. pc kann man also nur dazu benutzen, um es auf andere Variablen (Speicherbereiche) zeigen zu lassen oder man muss sich per malloc(), new oder sonstigen Speicherfunktionen auf dem Heap Speicher reservieren, auf den man mit pc zeigen kann (pc = new char[10];).
    Wenn man eine Variable wie ac anlegt, muss man bis auf eine Ausnahme bereits angeben, wie viel Speicher reserviert werden soll:
    char ac[10];
    Ausnahme:
    char ac[] = "Hallo du!";
    Auch bei der Ausnahme werden 10 Bytes reserviert, weil der bei der Deklaration zugewiesene String 9 Zeichen hat und ein Byte f?r das abschliessende 0-Byte ben?tigt wird.
    Das ist auch das Problem, was man mit Arrays hat. Man MUSS vorher wissen, wie gross sie sein sollen und kann sie im Nachhinein nicht mehr vergr?ssern. Wenn man nicht mit klassischen Zeigern, sondern mit Arrays arbeitet, st?sst man sp?testens beim Definieren einer Funktion auf ein Problem:
    void Machwas(char ac[100]);
    Wenn man diese Funktion benutzt, muss immer ein Array der Gr?sse 100 ?bergeben werden, alles andere wird vom Compiler nicht akzeptiert. Wenn das, was man ?bergeben will, eigentlich nur 10 Bytes lang ist, muss man 90 Bytes verschwenden. Wenn es l?nger ist, dann guckt man ganz dumm aus der W?sche. Daher macht man das so:
    void Machwas(char ac[]);
    In diesem Fall wird keine Gr?sse angegeben, sondern es wird einfach der Speicher auf dem Stack benutzt. Man kann es allerdings auch so machen:
    void Machwas(char * pc);
    In diesem Fall sind ac und pc absolut das Gleiche. Dies gilt allerdings nur bei der Deklaration von Funktionen.

    Zur?ck zum eigentlichen Problem:
    char ** kann in einer Funktionsdefinition auftauchen oder als normale Variable. Wozu braucht man es?
    Normale Variable:
    Wenn man zum Beispiel einen Satz einliest und diesen in einzelne W?rter aufsplitten will. Man z?hlt erst, wie viel W?rter es sind. Dann sucht man sich das l?ngste Wort raus und schaut, wie lang das ist. Dann:

    char ** pcSatz;
    pcSatz = new char * [iWortAnzahl];
    for (int i = 0; i < iWortAnzahl; i++)
    ???pcSatz = new char[iLaengstesWort + 1];
    (das + 1 ist notwendig f?r das abschliessende 0 Byte). Jetzt kann man den Satz in dieses zweidimensionale Array kopieren (Wort f?r Wort). Statt einfach "pcSatz = new char[iLaengstesWort + 1];" k?nnte man auch die wirkliche L?nge f?r jedes einzelne Wort benutzen und h?tte dann unter Umst?nden sehr viel Speicherplatz gespart.

    Funktionen:
    Ungef?hr das selbe. Das beste Beispiel ist die main Funktion und ich sch?tze mal, das du bei main() auf das char ** gestossen bist.
    int main(int argc, char ** argv)
    oder auch so (ist das Gleiche):
    int main(int argc, char * argv[ ])
    In diesem Fall bedeutet das, das du ein zweidimensionales Array mit verschiedenen Kommandozeilenparametern hast. Egal ob main() mit char ** oder mit char *[] deklariert ist, an die Parameter kommst du ran, indem du
    argv[nummer_des_gew?nschten_parameters - 1] benutzt.
    Hast du also ein Programm "hallo", das die Kommandozeilen Parameter ausliest, dann sieht das ungef?hr so aus:

    int main(int argc, char ** argv)
    {
    ???for (int i = 0; i < argc; i++)
    ??????printf("%i. Parameter: %s\n", i + 1, argv);
    ???return 0;
    }

    C:\>hallo.exe dies ist ein test blablablabla
    1. Parameter: dies
    2. Parameter: ist
    3. Parameter: ein
    4. Parameter: test
    5. Parameter: blablablabla

    C:\>_ (*rumblink*)

    Willst du zum Beispiel vom f?nften Parameter den 10. Buchstaben ?ndern, musst du das so machen:
    argv[4][9] = 'X';

    char ** benutzt man also f?r zweidimensionale Arrays von chars, bei denen du noch nicht weisst, wie gross dieses Array wird.

    Ich habe jetzt so viel geschrieben, ich hoffe, das das auch wirklich genau die passende Antwort auf deine Frage war ;-)



    Nachtrag 06.10.2004:
    Thread geschlossen weil Frage beantwortet.
    Wird auf Wunsch wieder er?ffnet. Dazu PN an einen der zust?ndigen Moderatoren senden.
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!