Allgemeine Frage zur Verwendung von Zeigern



  • Hallo,

    immer wieder die "Zeiger". Sind die folgenden 2 Aufrufe (foo1 und foo2) für char* und String korrekt ? Oder muss ich in der aufrufenden Funktion die Größe von char und String bekannt geben ? Funktionieren tut es erstmal so, aber ich weis nicht ob die Felder auch evtl. überschrieben werden können beim Programmlauf.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     String sText;
     char *Text;
    
     foo1( &Text );
     sText = Text;
     ListBox1->Items->Add( sText );
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     String sText;
    
     foo2( &sText );
     ListBox1->Items->Add( sText );
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::foo1( char **string )
    {
     char *test = "Das ist ein Beispiel-Text";
    
     *string = test;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::foo2( String *string )
    {
     String temp = "Das ist ein weiterer Beispiel-Text";
    
     *string = temp;
    }
    //---------------------------------------------------------------------------
    


  • Korrekt ist das erstmal (es sei denn es gibt in String irgendwelche unangenehmen Überraschungen). Aber es ist weder C und gehört damit entschieden nicht hierher, noch ist es gut.

    Und was ist deine im Titel angekündigte allgemeine Frage?



  • Hallo Bashar,

    das war meine allgemeine Frage, ob ich das so verwenden kann. Was ist da nicht gut dran ?



  • Wenn das eine allgemeine Frage war, was ist dann für dich eine spezielle Frage? 🙂



  • Hm, naja das ist weil ich bisher mit Zeigern nicht viel zu tun hatte. Aber es wäre nett von dir mir zu sagen was daran nicht gut ist 🙂



  • Das wird jetzt eine längere Liste ...

    • const, schonmal gehört? Du weist deinem char-Zeiger ein (als solches grundsätzlich unveränderliches) String-Literal zu, dann sollte der auch ein Zeiger auf const sein.
    • Referenzen sind eine feine Sache
    • Warum überhaupt Call-by-reference, benutze doch Rückgabewerte
    • Mach lieber deine ersten Schritte in normalem C++ und nicht mit dem C++-Builder ... oder kannst du mir exakt erklären, wozu du __fastcall brauchst? ("Das ist schneller" gilt nicht)
    • Du definierst deine Variablen am Anfang und weist ihnen dann irgendwas zu anstatt sie erst dann zu definieren (und zu konstruieren), wenn du sie brauchst.
    • irgendwas entscheidendes hab ich sicher noch vergessen ...
    • .oO(Schlafen die Moderatoren eigentlich?)


  • Ronco11 schrieb:

    weis nicht ob die Felder auch evtl. überschrieben werden können beim Programmlauf.

    ja, sie können überschrieben werden. fragt sich evtl ob man das möchte.


  • Mod

    Bashar schrieb:

    .oO(Schlafen die Moderatoren eigentlich?)

    Gähn! Was?
    🕶



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum C++ (auch C++0x und C++11) verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Hallo Bashar,

    erstmal danke für die Hinweise ...

    Bashar schrieb:

    Das wird jetzt eine längere Liste ...

    [*]const, schonmal gehört? Du weist deinem char-Zeiger ein (als solches grundsätzlich unveränderliches) String-Literal zu, dann sollte der auch ein Zeiger auf const sein.

    Das war nur ein Beispiel. Wenn der char String aber je nach Aufruf unterschiedlich ist, dann ist doch const fehl am Platz, oder ?

    [*]Referenzen sind eine feine Sache

    Wenn man sie verwenden kann bestimmt.

    [*]Warum überhaupt Call-by-reference, benutze doch Rückgabewerte

    Aber ist das nicht der Vorteil (Geschwindigkeit) gegenüber auf dem Stack auslagern ?

    [*]Mach lieber deine ersten Schritte in normalem C++ und nicht mit dem C++-Builder ... oder kannst du mir exakt erklären, wozu du __fastcall brauchst? ("Das ist schneller" gilt nicht)

    OK, das hab ich erstmal nur so übernommen. Hat aber auch nicht geschadet 🙂

    [*]Du definierst deine Variablen am Anfang und weist ihnen dann irgendwas zu anstatt sie erst dann zu definieren (und zu konstruieren), wenn du sie brauchst.

    OK, werde ich ändern.


Anmelden zum Antworten