Announcement

Collapse
No announcement yet.

char** ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • char** ?

    Hallo,

    ich habe folgende Funktion gefunden:

    Code:
    int vrml(int argc, char** argv)
    {
    ...
    }
    (1) Was ist denn ein char**? Dachte Zeiger auf char ist mit einem * oder & ?
    (2) Wie ruft man diese Funktion auf ? vrml(3,??);

    Sicher einfache Fragen für euch, aber ich stoße beim Lernen von C++ immer wieder auf "Wunder"

  • #2
    Ein Zeiger auf einen Zeiger
    Christian

    Comment


    • #3
      Wozu macht man sowas und was muss ich dann als zweiten Wert übergeben? Habe es so probiert :

      Code:
      char** file = "test";
      vrml(3, file);
      aber das geht nicht.
      'const char [5]' kann nicht in 'char **' konvertiert werden

      Comment


      • #4
        Kennst du google? http://openbook.galileocomputing.de/...23a6f03df18868
        Christian

        Comment


        • #5
          Ja, das wozu hätte ich mir klemmen können , habe auch schon nachgelesen, aber für den Aufruf finde ich nix. Sorry

          Comment


          • #6
            Habe es nach einem Bsp. versucht:

            Code:
            char file = "test";
            char *file2 = file;
            char **file3 = file2;
            vrml(3, file3);
            Aber das bringt auch nix. Bitte um Hilfe.

            Comment


            • #7
              "Bringt nichts" ist kein Fehler und irgendwie hast du die Beispiele nicht verstanden

              int m = 1;
              int * ptr = &m;
              int ** ptrptr = &ptr;
              Du siehst den Unterschied? Adressoperator
              Zuletzt editiert von Christian Marquardt; 11.04.2013, 18:38.
              Christian

              Comment


              • #8
                Ein Zeiger ist prinzipiell eine Variable in der eine Speicheradresse steht. Also praktisch:

                int intWert = 5
                int* intZeiger = &intWert;

                Hier lege ich zuerst eine Integer Variable an und schreibe in den Inhalt der Speicherzelle den Wert 5.

                Im Speicher sieht das so aus:

                Code:
                Speicherzelle Wert
                00000000000001 5
                Lege ich jetzt einen Zeiger drauf an, wie in der zweiten Zeile oben, sieht das im Speicher so aus:

                Code:
                Speicherzelle Inhalt
                00000000000001 5
                00000000000002 00000000000001
                Wenn ich nun auf *intZeiger zugreife passiert folgendes:

                1. Zur Speicherzelle der Variable intZeiger gehen -> 00000000000002
                2. Inhalt der Speicherzelle auslesen -> 00000000000001
                3. * Operator auf 00000000000001 anwenden und den Inhalt holen -> 5

                Deswegen verändert sich z.B. auch der Wert der Variable wenn Du einen zweiten Zeiger darauf machst und ihn damit änderst:

                int* zweiterIntZeiger = &intWert;

                Code:
                Speicherzelle Inhalt
                00000000000001 5
                00000000000002 00000000000001
                00000000000003 00000000000001
                Beide verweisen jetzt auf denselben Inhalt. Darauf können wir jetzt auch nochmal einen Zeiger legen:

                int** doppelZeiger = &intZeiger;

                Dann hast Du im Speicher folgendes:

                Code:
                Speicherzelle Inhalt
                00000000000001 5
                00000000000002 00000000000001
                00000000000003 00000000000001
                00000000000004 00000000000002
                Wenn Du jetzt schreibst:

                **doppelZeiger

                dann passiert im Hintergrund:

                1. gehe zur Speicherzelle von doppelZeiger (00000000000004) und hole den Inhalt -> 00000000000002 -> entspricht (doppelZeiger)
                2. gehe zu Speicherzelle 00000000000002 und hole den Wert -> 00000000000001 -> entspricht (*doppelZeiger)
                3. gehe zu Speicherzelle 00000000000001 und hole den Wert -> 5 -> entspricht (**doppelZeiger)

                Ich hoffe ich konnte es einigermaßen anschaulich erklären

                Frag einfach wenn Du noch Fragen hast.

                Comment


                • #9
                  Vielen, vielen Dank, das war echt anschaulich erklärt. Jetzt verstehe ich, was da passiert.

                  Comment


                  • #10
                    Freut mich dass es Dir geholfen hat

                    Comment


                    • #11
                      Noch eine kurze Bemerkung: Wenn Dir das char** völlig unbekannt vorkommt, dann sieh dir in verschiedenen Konsolenanwendungen, die Startparameter auswerten müssen, (Open-Source Beispiele gibt es im Netz ja genug) mal die main-Funktion an, dort ist üblicherweise der zweite Parameter entweder als Array von char* (char* argv[]) oder als Pointer auf char* (char** argv) deklariert. Nur in Hinblick auf die Frage "Wozu barucht man das"...

                      Comment

                      Working...
                      X