Zeiger



  • Hi

    Objekt* second(Objekt* xyz)
    

    heißt doch das es ein objekt als zeiger aufnimmt und als zeiger ausgibt, oder ?

    könnt ihr bitte ein beispiel geben damit ich mich mehr mit dem anfreunden kann.

    sry 2mal was falsch geschrieben ^^



  • Objekt* second(Objekt* xyz) {
       return xyz;
    }
    

    😃



  • Zeiger sind vor allem für dynamische Speicherallokation (new/delete) wichtig:

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
        unsigned n;       // Anzahl Werte
        double   s;       // Summe 
        int   * pa;       // Zeiger auf dynam. Array 
    
        cout << "Wie viele Zufallswerte? ";
        cin >> n;         // Erst zur Laufzeit ermittelt !!! 
        pa = new int[n];  // dynamisches Array zur Laufzeit anfordern !!!
    
        srand( unsigned( time(0) ) );
    
        for (int i=0; i<n; i++)
        {
            pa[i] = rand() % 99 + 1 ; // Zufallszahlen 1 ... 99 generieren
          //cout << pa[i] << ' ';
        }
    
        s = 0;
        for( unsigned i=0; i<n; ++i )
            s += static_cast<double>( pa[i] );
        cout << endl << "Mittelwert: " << s / n << endl; // Erwartung: 50.0
    
        delete[] pa;  // Speicher für dynamisches Array freigeben.
        pa = NULL;    // Zur Sicherheit gelöschten Zeiger auf NULL setzen.
    
        getch();
    }
    
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    void textcolor(int color)
    { 
        SetConsoleTextAttribute( ::GetStdHandle(STD_OUTPUT_HANDLE), color ); 
    } 
    
    class X
    {
      public:
        X()                             // Konstruktor 
        {    
           textcolor(LIGHTGREEN);
           cout << "ctor von X\n"; 
        } 
        ~X()                            // Destruktor
        { 
           textcolor(LIGHTRED); 
           cout << "dtor von X\n"; 
        } 
    };
    
    int main()
    {
        {
            int n;
            cout << "Anzahl Objekte?\n";
            cin >> n;
    
            X * pX = new X[n]; 
            textcolor(WHITE);
            cout << "Speicheradressen (Heap):" << endl; 
            for( int i=0; i<n; ++i )
                cout << pX+i << endl;
            delete[] pX; // Fehler ist einfaches delete anstelle delete[] 
            pX = NULL;   // Null-Zeiger schafft zusätzliche Sicherheit!
        }
        getch();
    }
    

    Ansonsten hier Pointer, Referenzen bei Funktionen im Vergleich:

    #include <iostream>
    #include <conio.h>
    using std::cout;
    using std::endl;
    
    //globale Variablen
    int a = 1; 
    int b = 2;
    
    void ausgabe()
    {
        cout << &a << ": " << a << "\t " << &b << ": " << b  << endl << endl;
    }
    
    void erfolgloser_swap( int x, int y )
    {
      cout << "Kopien auf dem Stack: " << endl;
      cout << &x << ": " << x << "\t " << &y << ": " << y << endl;
    
      int temp = x;
      x = y;
      y = temp;
    
      cout << &x << ": " << x << "\t " << &y << ": " << y << endl;
      cout << "swap nur lokal erfolgreich." << endl;
    }
    
    void zeiger_swap( int * x, int * y ) // C-Lösung
    {
      int temp = *x; // Inhalts-Operator // Dereferenzierungs-Operator
      *x = *y;
      *y = temp;
    }
    
    void referenzen_swap( int & x, int & y ) // C++-Lösung
    {
      int temp = x;
      x = y;
      y = temp;
    }
    
    int main()
    { 
        cout << "Ausgangssituation: " << endl;
        ausgabe();
    
        cout << "Tausch mittels std::swap(x,y): " << endl;            
        std::swap(a,b); // Methode der Wahl aus der STL
        ausgabe();
    
        cout << "Tausch mittels Zeiger: " << endl;            
        zeiger_swap(&a, &b);
        ausgabe();
    
        cout << "Tausch mittels Referenzen: " << endl;            
        referenzen_swap(a,b);
        ausgabe();
    
        cout << "Erfolgloser Tausch, da nur lokale Kopien getauscht werden." << endl;            
        erfolgloser_swap(a,b);
        ausgabe();
    /*
        cout << "Tausch mittels Register eax und ebx: " << endl;         
        //swap (a,b) 
        __asm("mov _b, %eax"); //AT&T Syntax bei Dev-C++ 
        __asm("mov _a, %ebx"); 
        __asm("mov %eax, _a"); 
        __asm("mov %ebx, _b"); 
        ausgabe(); 
    */
        getch();
    }
    
    // Beispiel: Fernbedienung
    #include <iostream>
    #include <iomanip> // setw(...)
    #include <string>
    using namespace std;
    
    void kanal_anzeige( string * kanal, char eingabe );
    
    int main()
    {
        string kanal[] = {"ARD","ZDF","RTL","HR3","SWF3","BR3","MDR","CNN","3SAT"};
        const int N = sizeof( kanal ) / sizeof( kanal[0] ); // Anzahl = Größe Array / Größe Element
    
        for( int i=0; i<N; ++i )
            cout << "Kanal " << setw(2) << i+1 << " :" << kanal[i] << endl;
        cout << endl;
    
        while(true)    
        {
           char eingabe, letzte_eingabe;
           letzte_eingabe = eingabe;
           cout << "Eingabe: ";
           cin  >> eingabe;        
           if( ( eingabe>'0' ) && ( eingabe <= static_cast<char>(N+48) ) ) // ASCII 48 ist '0'
           {
             kanal_anzeige( kanal, eingabe );
           }
           else if (eingabe == '+')
           {
               eingabe = letzte_eingabe+1;
               kanal_anzeige( kanal, eingabe );
           }
           else if (eingabe == '-')
           {
               eingabe = letzte_eingabe-1; 
               kanal_anzeige( kanal, eingabe );       
           }
           else if (eingabe == '0')
               break;   
           else 
               continue;    
        }
    }
    
    void kanal_anzeige( string * kanal, char eingabe )
    {
         cout << "Gewaehlter Kanal: " << eingabe << " - " 
              << *(kanal + static_cast<int>(eingabe-1-48)) << endl;
    }
    

Anmelden zum Antworten