Der Unterschied zw. diesen zwei Zeigern



  • Hallo zusammen,

    ich lerne c++ für Spaß und ich beschäftige mich mit interessanten Aufgaben, die ich damit wahrscheinlich mehrere Fragen bald haben werde.

    Meine erste Frage ist:

    //1.cpp
    
    int main ()
    {
    int *k=0;
    
    const int* const &i=k; //*
    // und
    const int * const i=k; //**
    }
    

    beide kompilieren ohne Problem, aber wieso genau? Was bringt das & vor i? Wie wird man genau * in Worten beschreiben? Ist es ein Referenz zu einem konstanten Zeiger, der zu einer konstanten Zahl zeigt?

    ** ist einfach ein konstanter Zeiger zu einem NULL Zeiger. Also ist i ein konstanter Zeiger zu NULL.

    Wann kann man Probleme mit g++ -c 1.cpp haben? -c produziert eine .o Datei aber gibt es genau Situationen, in denen g++ -c Fehler zeigen würde?

    Danke in Voraus!



  • In C++ liest man Datentypen von rechts nach links:
    const int* const &i -> Referenz auf einen konstanten Zeiger auf einen int, der konstant ist.
    const int * const -> Konstanter Zeiger auf einen int, der konstant ist.

    g++ -c liefert dann Fehler, wenn dein Quellcode syntaktisch nicht in Ordnung ist.



  • Hallo Incocnito,

    ich danke Dir für die Erklärung. Das macht jetzt Sinn. Aber ohne "-c" werden auch Fehler über syntaktische Gründe gegeben, oder?



  • Meine nächste Frage:

    kann jemand bitte erklären was genau diese Liste ist/macht?

    std::list<std::pair<int,char> >*q;
    


  • Wenn du nur "g++ -c Dateiname.cpp" schreibst, erzeugst du eine Objekt-Datei "Dateiname.o". Diese Objektdatei enthält quasi die Ausgabe des Compilers und kann anschließend mit "g++ -o Programmname Dateiname.o -lm" in eine ausführbare Datei zusammengelinkt werden. Dies ist wichtig, wenn das Programm aus mehreren verschiedenen Quellcodedateien besteht. Dann kann am Ende für jede Quellcodedatei eine Objekt-Datei erzeugt und über "g++ -o 1.o 2.o 3.o etc. Programmname -lm" in eine Executable gelinkt werden. Ohne das -c wird die Objekt-Datei direkt in eine Executable gelinkt (Standardname: a.exe).

    Ein std::pair<Typ1, Typ2> ist erstmal nur ein 2-Tupel aus irgendwelchen Daten (in diesem Fall int und char, also zb. std::pair<int, char> aPair(3, 'c'); ). Die sind zb. im Zusammenhang mit std::map wichtig, mehr dazu siehe http://en.cppreference.com/w/cpp/utility/pair/pair.



  • Das ist natürlich ein Zeiger auf... was würdest du sagen, nachdem du
    http://www.cplusplus.com/reference/list/list/
    http://www.cplusplus.com/reference/utility/pair/?kw=pair
    gelesen hast?



  • Ah danke. Ja ich habe schon list und pair auf cplusplus gelesen aber ich war nicht sicher, ob ein Zeiger da gültig ist.



  • laraplp schrieb:

    Ah danke. Ja ich habe schon list und pair auf cplusplus gelesen aber ich war nicht sicher, ob ein Zeiger da gültig ist.

    Wieso sollte das nicht gültig sein? Ein Zeiger eines Typs kann auf ein Objekt dieses Typs zeigen.



  • So dann braucht man andere Listen (mindestens eine), die das gleiche Pair-Objekt hat und das Pair-Objekt muss dann auch gleich sein, um den Zeiger zu benutzen?



  • laraplp schrieb:

    So dann braucht man andere Listen (mindestens eine), die das gleiche Pair-Objekt hat und das Pair-Objekt muss dann auch gleich sein, um den Zeiger zu benutzen?

    Ne. Es geht um den Typ eines Objekts, und nicht um den Zustand eines Objekts. Ob die Ampel rot ist oder grün, interessiert den Zeiger nicht, Hauptsache es ist eine Ampel.



  • Vielleicht ein Beispiel?

    #include <list>
    #include <utility> //std::pair
    #include <iostream>
    
    int main()
    {
    	std::list<std::pair<int, char>>* pointerToList = nullptr; //Dieser Zeiger kann auf irgendeine list<pair<int, char>> zeigen
    	std::list<std::pair<int, char>> aList; //irgendeine list<pair<int, char>>
    	pointerToList = &aList; //drauf zeigen lassen
    
    	//Folgendes geht NICHT (meintest du das?):
    	//std::list<std::pair<float, double>> anotherList;
    	//pointerToList = &anotherList; //Zeiger kann eben nur auf eine list<pair<int, char>> zeigen
    
    	aList.push_back(std::make_pair(3, 'c')); //einen Wert reinpacken
    	std::cout << pointerToList->front().first << " " << pointerToList->front().second; //Zugriff ueber den Zeiger
    }
    


  • Ja! Genau was ich meinte. Dankeschön fürs Beispiel. Ich gehe jetzt schlafen aber ich habe mehrere Fragen. Ich hoffe, dass es ok wäre, wenn ich diesen Beitrag benutzte, um weitere Fragen zu stellen.



  • Hallo,

    kann mir jemand erklären, was das zweite Argument hier macht? Oder was ist das genau?

    int f(int* (*g)(int*));



  • Zweites Argument? Siehst du da ein Komma?

    Das sind deine Hausaufgaben. Gehe das Unterrichtsmaterial noch mal durch.



  • Es sind keine Hausaufgaben. Wie mein erster Beitrag steht: ich lerne c++ momentan als Hobby. 🙄



  • Der Parameter ist ein Zeiger auf eine Funktion, die einen int* zurückgibt und einen int* als Parameter hat:

    int* foo(int* pointer)
    {
    	//...
    }
    
    int main()
    {
    	int* (*functionPointer)(int*) = foo;
    	int* pointer;
    	functionPointer(pointer); //rufe foo über den Zeiger auf
    }
    

    Aber schau dir mal lieber std::function an, in modernem C++ ist das das Mittel der Wahl bei Funktionsobjekten, Funktionen und irgendwelchen Zeigern darauf http://en.cppreference.com/w/cpp/utility/functional/function



  • laraplp schrieb:

    Hallo,

    kann mir jemand erklären, was das zweite Argument hier macht? Oder was ist das genau?

    int f(int* (*g)(int*));

    g ist ein Zeiger auf eine Funktion, die einen int-Zeiger als Parameter hat und einen int-Zeiger zurückgibt.
    Wieso beschäftigst du dich als Anfänger so viel mit Zeigern? Du solltest C++ richtig von Grund auf lernen, und nicht irgendwo anfangen.



  • Super. Danke!



  • laraplp schrieb:

    Es sind keine Hausaufgaben. Wie mein erster Beitrag steht: ich lerne c++ momentan als Hobby. 🙄

    Wer‘s glaubt...



  • laraplp schrieb:

    Es sind keine Hausaufgaben. Wie mein erster Beitrag steht: ich lerne c++ momentan als Hobby. 🙄

    Nicht so sehr die Thematik sondern vor allem die Fragen, die du dazu stellst, riechen doch sehr nach Hausaufgaben.
    Irgendwo musst du die Ausdrücke ja her haben - und jemand, der die selbst zusammengebaut hat, würde eher fragen,
    warum das Ding nicht so funktioniert wie erwartet, oder "ob mas das so schreiben kann". Du fragst jedoch ein wenig
    wie der "Ochse vorm Berg", als hätte dir jemand diese Audrücke vorgesetzt und du musst jetzt sagen, was sie bedeuten 😉


Anmelden zum Antworten