Konstante Zeiger definieren



  • Hallo,

    ich lese mich gerade in C++ ein und bin bei den Zeigern schon auf das erste Problem gestoßen:

    Einen Zeiger mit int *zeiger; zu definieren funktionierte ohne Probleme. Auch ein Zeiger auf ein konstantes int ging: const int *zeiger; .

    Dann stand im Buch jedoch folgendes:

    const *char cptr = 0;
    

    (für einen konstanten Zeiger).

    Wenn ich dies allerdings compile, kommt eine Fehlermeldung:

    test.cpp: In function `int main()':
    test.cpp:8: error: expected unqualified-id before "char"
    test.cpp:8: error: expected initializer before "char"
    

    Google hat mich dann auf die Variante char * const cptr = 0; gebracht.

    Was ist denn nun "richtig" bzw. funktioniert die Variante aus dem Buch überhaupt irgendwie - und ich stelle mich einfach zu blöd an? Oder gibt es in Sachen Zeigerdefinition einen Standard, an den man sich halten sollte?



  • const char *cstr = "Hallo"; // Zeiger auf konstante Daten
    char * const cstr = "Hallo"; // Konstanter Zeiger auf Daten
    const char * const cstr = "Hallo"; // Konstanter Zeiger, konstante Daten
    

    Wo const steht ist egal. const int a == int const a.
    Wenn const links vom * steht, ist der Zeiger konstant, andernfalls die Daten.



  • Leider bekomme ich trotzdem diese Fehlermeldung, wie eben auch:

    #include <iostream>
    using namespace std;
    
    int main(void) {
    
        const * char cstr = "Hallo"; // Konstanter Zeiger auf Daten
    
        return 0;
    
    }
    
    test.cpp: In function `int main()':
    test.cpp:6: error: expected unqualified-id before "char"
    test.cpp:6: error: expected initializer before "char"
    

    Als Compiler nehme ich GCC.



  • Es heißt ja auch char * const , rechte Seite vom * ist const ---> Konstanter Zeiger



  • Also doch so? 🙂

    Gut, so funktioniert es auch einwandfrei. Dankeschön.



  • Amgon schrieb:

    Leider bekomme ich trotzdem diese Fehlermeldung, wie eben auch:

    #include <iostream>
    using namespace std;
    
    int main(void) {
    
        const * char cstr = "Hallo"; // Konstanter Zeiger auf Daten
    
        return 0;
    
    }
    

    Bist Du dir sicher, dass Du dich nicht verguckt hast? Steht im Buch vielleicht:

    char * const cstr = "Hallo";
    

    ?

    Denn const*char macht wirklich keinen Sinn.

    edit: Upps! Ich sollte mir angewöhnen, vor dem Antwortschreiben mal die Seite zu refreshen. 😉



  • Klar, wie sonst? Eine logischere Eselsbrücke als das Links/Rechts vom Stern wäre etwa:

    +-----------+-----------+
       |  Datentyp | Zeigertyp |
       +-----------+-----------+
       |   char    |    *      | = char *data, nicht const-Daten/Pointer
       |const char |    *      | = const char *data, nicht const-Pointer, const-Daten
       |   char    |  *const   | = char *const data, nicht const-Daten, const Pointer
       |const char |  *const   | = const char *const data, const-Daten/Pointer
       +-----------+-----------+
    


  • @Amgon:
    Also wenn dann bitte

    const char* const cstr = "Hallo"; // Konstanter Zeiger auf Daten
    

    Du zeigst ja schließlich auf ein Stringliteral.


Anmelden zum Antworten