Pointer Frage



  • Hallo zusammen,

    kleine bescheidene Frage bei Pointern, dazu folgender Code:

    char* char_pointer = new char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> *char_pointer;
    

    Wie kann ich das ohne "new" lösen? Hab für die Benutzung von "new" Punktabzug bekommen (war eine Uni-Aufgabe).

    Ohne new wird doch gar kein Speicherplatz reserviert, oder täusche ich mich?



  • char c;
    std::cout << "Bitte ein char eingeben: ";
    std::cin >> c;
    

    Basics, anyone?

    Nur nochmal zur Verdeutlichung: mit dem new-Schlüsselwort wird der speicher auf dem Heap reserviert während er in meinem Beispiel auf dem Stack allokiert wird. In der Regel sollte man den Stack als Speicherstelle bevorzugen, da er schneller ist als der Heap, besonders wenn es um kurzlebige und kleine Allokationen (typischerweise lokale Variablen) geht.



  • beselbube schrieb:

    Hab für die Benutzung von "new" Punktabzug bekommen (war eine Uni-Aufgabe).

    Das ist nachvollziehbar. Dynamische Speicherverwaltung ist nämlich nicht nur langsamer und fehleranfälliger, sondern hier komplett fehl am Platz. Benutze new nur, wenn du es wirklich brauchst, und setze in diesem Fall delete ein.



  • Sollte ich dazu sagen, dass wir es mit Pointern machen mussten? 🙂



  • beselbube schrieb:

    Sollte ich dazu sagen, dass wir es mit Pointern machen mussten? 🙂

    Lieber nicht, das verstärkt nur den Hass auf C++-Lehrmethoden an Unis...

    Zeiger sind hier nicht sinnvoll, es sei denn, du teilst uns einen wesentlichen Teil der Aufgabenstellung nicht mit.



  • Die lassen euch wahrscheinlich alles mit Pointern machen, bis ihr euch gar nicht mehr vorstellen könnt, wie es ohne gehen sollte um anschließend zu zeigen, dass Java das gleiche macht, aber kein * braucht und die memory-leaks, die in c++ natürlich zwangsweise auftreten _müssen_ ganz schlimm sind 😉



  • Nexus schrieb:

    Das ist nachvollziehbar. Dynamische Speicherverwaltung ist nämlich nicht nur langsamer und fehleranfälliger, sondern hier komplett fehl am Platz.

    Das sehe ich auch so.

    beselbube schrieb:

    Sollte ich dazu sagen, dass wir es mit Pointern machen mussten? 🙂

    Ja, unbedingt.

    Der Abzug für new ist mir unverständlich. Außer es ist ein Abzug für "Der hat heimlich woanders gelernt und nicht bei nur mir dem einzig wahren Lehrer". Falls dem so ist, merke Dir seine Eigenheiten, also genau das, was die Profis wie Nexus ankreiden und schubse ihm in der Klausur seinen eigenen Stil von hinten wieder rein. Auf Uni gibt's nämlich für 100% Fachkenntnis keine sichere 1 mehr, sonder oft nur eine 2. Für die sichere 1 muß man auch noch erahnen, was der Bewerter so denken wird, was unglaublich schwierig wird, wenn ein Assi benotet, den man gar nicht kennt. Viel Erfolg!

    Mir ist folgende Lösung eingefallen, zwar einen char direkt ohne new anzilegen, aber trotzdem Zeiger zu benutzen:

    char der_char;
    char* char_pointer = &der_char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> *char_pointer;
    


  • char c;
    std::cin >> *&c;
    std::cout << *&c;
    

    😃



  • 314159265358979 schrieb:

    char c;
    std::cin >> *&c;
    std::cout << *&c;
    

    😃

    👎



  • char *c;
    std::cin >> (char&)c;
    

    [Müllgeschnippt]



  • spassbremse schrieb:

    314159265358979 schrieb:

    char c;
    std::cin >> *&c;
    std::cout << *&c;
    

    😃

    👎

    👎



  • Nexus schrieb:

    beselbube schrieb:

    Sollte ich dazu sagen, dass wir es mit Pointern machen mussten? 🙂

    Lieber nicht, das verstärkt nur den Hass auf C++-Lehrmethoden an Unis...

    Zeiger sind hier nicht sinnvoll, es sei denn, du teilst uns einen wesentlichen Teil der Aufgabenstellung nicht mit.

    okok, zur Rettung meiner Uni: (wusste gar nicht, dass es hier so ein Unbehagen auslöst)

    Die Aufgabenstellung im Wortlaut: (Die 3.3 war hier gefragt)

    *3.1 Datentypen einlesen
    Schreiben Sie ein Programm, dass von der Tastatur nacheinander die folgenden Datentypen
    einliest:
    char
    int
    float
    double
    Anschließend sollen die Variablen auf der Konsole ausgegeben werden.

    3.2 Pointererstellung
    Erweitern Sie das erstellte Programm aus 3.1 um Pointer. Führen Sie zunächst Pointer der 4
    Datentypen ein und weisen Sie das Ergebnis der Eingabe den Pointern zu. Geben Sie anstatt
    der Variablen die dereferenzierten Pointer auf der Konsole aus.

    3.3 Pointernutzung
    Ändern Sie das Programm aus 3.2 indem Sie direkt die Pointer einlesen und anschließend den
    Inhalt der Pointer ausgeben. Setzen Sie zum Abschluss alle Pointer auf den NULL-Pointer und
    geben Sie die Pointer erneut auf der Konsole aus. Was fällt Ihnen dabei auf.*

    Es ging also explizit darum Pointer zu trainieren.

    Zur eigentlichen Frage:
    Es geht also nur wie Volkard es vorschlägt und mit new?

    Meine Lösungen übrigens in Kurzform:

    3.1:

    char input_char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> input_char;
    

    3.2:

    char* char_pointer;
    char input_char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> input_char;
    char_pointer = &input_char;
    

    3.3:

    char* char_pointer = new char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> *char_pointer;
    


  • Löse mal 3.2 wie folgt, dann weisst du bestimmt auch, was in 3.3 zu machen ist:

    char input_char;
    char* char_pointer = &input_char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> input_char;
    std::cout << *char_pointer;
    


  • Jockelx schrieb:

    Löse mal 3.2 wie folgt, dann weisst du bestimmt auch, was in 3.3 zu machen ist:

    char input_char;
    char* char_pointer = &input_char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> input_char;
    std::cout << *char_pointer;
    

    ungetestet würde ich folgendes tun:

    char input_char;
    char* char_pointer = &input_char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> *char_pointer;
    


  • beselbube schrieb:

    ungetestet würde ich folgendes tun:

    char input_char;
    char* char_pointer = &input_char;
    std::cout << "Bitte einen char Eingeben: ";
    std::cin >> *char_pointer;
    

    Jetzt hast du's 🙂 (Abgesehen von dem Teil mit "Zeiger auf 0 setzen")



  • Wenn man da einen Zeiger auf eine lokale Variable eine Zeile darüber nimmt, fühlt sich der Hiwi doch veralbert!
    Also ich würde einen Small Object Allocator mit einer zu char konvertierbaren Klasse implementieren!



  • Ich finde, so schwammig, wie die Aufgaben (vor allem 3.2 und 3.2) definiert sind, sollte sich der "Professer" (oder was auch immer das für einer ist) sich mit Punktabzügen zurückhalten. Mal ganz davon abgesehen, dass die Aufgaben total bescheuert sind.
    Ich finde, gerade beim Thema Zeiger sollte man schon genau beschreiben, was gemacht werden soll. Ich bezweifle z.B. bei Aufgabe 3.3 ganz stark, dass wirklich der Inhalt der Zeiger ausgegeben werden soll.



  • Über die Aufgabenstellung kann man natürlich streiten.. Mir ging es primär darum, wie ich es ohne new löse 🙂 Alles andere war ja kein Problem. Also danke soweit! 👍


Log in to reply