Pointer-Problem



  • Moin,
    ich bin dabei C++ mir mit Hilfe eines Buches anzueignen, jedoch stehe ich noch ziemlich am Anfang. Dezeit stehe ich vor einem Problem bei einer Aufgabe. Es geht um Zeiger.

    Die Aufgabe lautet:
    Was gibt das Programm aus?

    // das Programm:
    #include <iostream>
    using namespace std;

    int main() {

    char *satz= "Hier bin ich!";
    satz++;
    cout << satz;
    return 0;
    }
    Die Loesung soll sein: ier bin ich!"
    Meiner Meinung nach muesste das Programm aber die Adresse vom "i" ausgeben. Ein Zeiger gibt doch immer die Adresse an unter der ein Wert gespeichert ist. Deshalb verwirrt mich die Loesung ein wenig.

    Waere das Ende der Aufgabe:

    cout << *satz;

    dann muesste die Aufgabe wieder stimmen, oder?



  • Erstens: Du hast dich in der Etage geirrt - bestimmt schiebt dich bald ein Kollege rüber ins C++ Board.

    Zweitens: Der Ausgabe-Operator ist für eine Reihe von elementaren Datentypen überladen, unter anderem auch für void* (Ausgabe der Adresse) und char* (Ausgabe aller Zeichen ab der Position bis zum Null-Terminator). In deinem Beispiel greift die letztgenannte Überladung und gibt den String aus (wegen des satz++; ohne den Anfangsbuchstaben).



  • Vielen Dank fuer die schnelle Antwort. 🙂

    Nur um zu schauen, ob ich es richtig verstanden habe; Es liegt also an den Eigenschaften von cout. (Ueberladungen hatte ich noch nicht, kommen erst spaetern Kapiteln vor.)

    Wuerde die von mir Vorgeschlagene Variante auch zum Ergebnis fuehren?



  • Nein, um es ganz allgemein zu sagen: Es liegt an den Eigenschaften der IO-Streams.

    Exakter: Überladung bedeutet, daß es mehrere Funktionen mit dem gleichen Namen geben kann und der Compiler anhand der Parametertypen in der Lage ist zu entscheiden, welche dieser Funktionen er tatsächlich verwenden soll. Und in diesem Zusammenhang wird der Ausgabe-Operator zurückgeführt auf eine ganz normale Funktion ostream& operator<<(ostream& out, TYP data); (hier auf die Version mit TYP=char*).
    Die Variante cout<<*satz; dereferenziert den Zeiger und übergibt den Wert dahinter (also das 'i') an den Operator (diesmal die Variante mit TYP=char, die das entsprechende ASCII-Zeichen ausgibt). Wenn du wirklich die Adresse haben willst, mußt du dem Compiler schon klarmachen, daß er die Version mit TYP=void* verwenden soll: cout<<static_cast<void*>(satz); .



  • Das klingt einleuchtend. Vielen Dank 🙂
    Es geht also beides. Ich hatte schon Angst was Grundlegendes nicht verstanden zu haben.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @eineFrage: Nimm (C++ -)Code-Tags für deine Quellcodes.


Anmelden zum Antworten