Pointer



  • Hi,
    ich wollte ein Beispiel nach dem "Buch C++ Primer" folgenden Code ausführen:

    const char *cp1 = "A string example";
    

    Leider bekomme ich mit Xcode (GCC 4.x) folgende Fehlermeldung:

    error: invalid initializer

    Weiss jemand weiter?!

    THX im Voraus!

    L. G.
    Steffo



  • Die Codezeile und der Fehler haben nichts mit einander zu tun.



  • Stimmt, bei mir lässt es sich problemlos kompilieren. (Hab den Borland C++ 5.5) Bist du dir sicher, dass der Fehler des Compilers etwas mit dieser Zeile zu tun hat? Wenn der Quelltext nicht zu lang ist, könntest du ihn ja mal ganz Posten. Eventuell könntest du auch mal versuchen, den Code mit einem anderen Compiler zu kompilieren.

    MfG, Jochen



  • Es ist zwar ungewoehnlich, den Fehler zur Loesung zu posten, aber vielleicht
    hast du irgendwo in deinem Code zum Beispiel sowas:

    // dies wuerde zu error: invalid initializer fuehren wegen []
    const char *cp1[] = "A string example";
    

    und hast hier die falsche Zeile erwischt 😃

    Deine gepostete Codezeile ist richtig.



  • Danke, für eure Antworten!

    Ich bekomme sowohl bei cp1, als auch bei cp2 den genannten Fehler:

    #include <iostream>
    #include<string>
    
    using std::string;
    using std::cout;
    using std::cin;
    
    int main (int argc, char * const argv[]) {
    	int iBla;
    
    	const char *cp1[] = "A string example"; //16 Zeichen lang
        const char *cp2[] = "A different string"; //18 Zeichen lang8
    
    	char largeStr[16 + 18 + 2];
    
    	strcopy(largeStr, cp1);
    
    	cin >> iBla;
        return 0;
    }
    

    L. G.
    Steffo



  • const char *cp1 = "A string example"; //16 Zeichen lang
    char *cp2 = "A different string"; //18 Zeichen lang8
    

    du hattest es doch richtig 🙂

    //Edit: In Zeile 15 fehlt ein Semikolon am Ende



  • OK, habe den Code nun 2 Posts weiter oben editiert, aber der Fehler bleibt bei beiden Pointern bestehen. 😞

    L. G.
    Steffo



  • Steffo schrieb:

    OK, habe den Code nun 2 Posts weiter oben editiert, aber der Fehler bleibt bei beiden Pointern bestehen. 😞

    L. G.
    Steffo

    Du musst die eckigen Klammern hinter cp1 und cp2 weglassen.



  • Oh, stimmt! Ist ja kein Array! 😕
    THX! 🙂

    L. G.
    Steffo



  • Steffo schrieb:

    Oh, stimmt! Ist ja kein Array! 😕
    THX! 🙂

    L. G.
    Steffo

    Ein String ist ein Array. Schließlich deklarierst du mit char * einen Zeiger auf ein Array von char. Aber das führt wohl zu weit.



  • Stimmt auch nicht ganz, mit * deklarierst du einen Zeiger auf ein char. Ein Zeiger auf ein Array von char sieht so aus: char (*p)[]; .

    Aber das führt definitiv zu weit 😉



  • Ich habe zu dem geposteten Beispiel im Buch noch eine Frage:

    const char *cp1 = "A string example"; //16 Zeichen lang
        const char *cp2 = "A different string"; //18 Zeichen lang
    
    	char largeStr[16 + 18 + 2];
    
    	strcpy(largeStr, cp1);
    	strcat(largeStr, " "); //Ein Leerzeichen am Ende von largeStr einfügen
    	strcat(largeStr, cp2);
    
    	//Gibt "A string example A different string" aus.
    	cout<< "\nlargeStr: " << largeStr;
    

    Bei

    char largeStr[16 + 18 + 2];
    

    werden am Ende 2 Zeichen hinzugefügt. Eins fürs Leerzeichen und das andere? Für das abschließende Nullzeichen? Im Buch steht's nicht drin!

    Ferner habe ich bei der Autovervollständigung erkannt, dass strcat(<#char * #>, <#const char * #>) beim ersten Parameter ein char * verlangt, aber ich habe largeStr nicht wirklich als Pointer deklariert und wieso muss der zweite Parameter konstant sein?!

    EDIT: Ich merke gerade, dass der Code auch dann geht, wenn der zweite Parameter nicht konstant ist.

    Danke wieder im Voraus!

    Liebe Grüße
    Steffo



  • Steffo schrieb:

    Bei

    char largeStr[16 + 18 + 2];
    

    werden am Ende 2 Zeichen hinzugefügt. Eins fürs Leerzeichen und das andere?

    Das steht für das '\0' (0-Terminierungs-)Zeichen, das am Ende angehangen werden muss



  • const char* ist ein Zeiger, dessen Ziel (in dem Fall ein String) nicht verändert werden kann. Dadurch das die Funktion einen const char* als Parameter übernimmt garantiert sie dir, dass sie den String nicht verändern wird, sie kann es schlicht nicht. Wenn du statt dessen einen char* übergibst wird das implizit einfach zu einem const char* konvertiert, denn Schreibschutz hinzufügen ist ungefährlich. Andersherum geht das dagegen nicht, einen const char* kann man nicht ohne weiteres in einen char* konvertieren.



  • hgjghj schrieb:

    Ein String ist ein Array. Schließlich deklarierst du mit char * einen Zeiger auf ein Array von char.

    Ein Zeiger vom Typ char* ist ein Zeiger, der auf ein char-Objekt zeigen kann -- wie zB das erste Element eines char-Arrays. Es ist aber kein Zeiger auf ein Array. Ein Zeiger auf ein char-Array ist vom Typ char(*)[N] , wobei N die Anzahl der Elemente des Arrays ist.

    #include <iostream>
    
    int main() {
      const char *p = "p zeigt auf das erste Zeichen";
      const char (*q)[31] = &"q ist ein Zeiger auf ein Array";
      std::cout << p << '\n';
      std::cout << *q << '\n';
    }
    


  • Danke, für eure Antworten, hat mir wirklich weitergeholfen! 🙂

    EDIT: Ich sehe gerade, dass die Antwort im Buch auf der nächsten Seite stand. 😕

    L. G.
    Steffo


Anmelden zum Antworten