[C/C++] Zeiger auf mehrdimensionale array ?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Richie, 31. Mai 2008 .

Schlagworte:
  1. 31. Mai 2008
    Zeiger auf mehrdimensionale array ?

    Hallo,
    habe folgendes Problem und zwar soll ich auf das Array einen Zeiger legen. Wenn ich nun ein konkretes Feld habe wie z.B. matrix [0][0] ist das kein Problem.

    Das Problem beginnt erst in der For-Schleife .
    Dort lasse ich nämlich das array "hochlaufen" , mittels dem counter1 und counter2.

    Ich weiß, dass der zeiger, immer auf eine Adresse zeigt, beim hochzählen sind das ja im endeffekt 4 Addressen.

    Meine Frage ist jetzt, wie löse ich das Problem in der For Schleife mittels eines Zeigers ?
    Geht das überhaupt in einer Schleife ?

    Er müsste ja die Adresse hochzählen Oo.



    Matrix Header:

    Code:
    #include <iostream>
    
    using namespace std;
    
    class Matrix
    {
     private:
     
     int matrix[2][2];
     int row1;
     int row2;
     int column1;
     int column2;
     int counter1;
     int counter2;
     
     int *pointer1 ;
     int *pointer2 ;
     int *pointer3 ;
     int *pointer4 ;
    
     public:
     
     Matrix ();
     void ShowMessage ();
     int FillMatrix( ); // Werte Einrag in die Schleife durch Usereingabe
     void ShowMatrix ( ); // Auslesen und Wiedergabe der Matrix
     void CalcMatrixRow ( ); // Addition der Zeilen
     void CalcMatrixColumn ( ); // Addition der Spalten
    };
    Matrix CPP


    Code:
    #include "Matrix.h"
    
    Matrix::Matrix()
    {
     row1= 0;
     row2= 0;
     column1 = 0;
     column2 = 0;
     counter1 = 0;
     counter2 = 0;
     pointer1 = &matrix[0][0]; // zeiger auf matrix [0][0]
     pointer2 = &matrix[0][1];
     pointer3 = &matrix[1][0];
     pointer4 = &matrix[1][1];
    }
    
    
    
    void Matrix::ShowMessage()
    {
     cout << "\t|===================================================================|" << endl;
     cout << "\t|Diese Programm erstellt mittels ihrer Eingabe eine 2 X 2 Matrix, |" << endl; 
     cout << "\t|desweiteren werden die Zeilen und die Spalten ihrer Matrix addiert,|" << endl;
     cout << "\t|davor wird jedoch Ihre erstellte 2 X 2 Matrix ausgeben. |" << endl;
     cout << "\t|===================================================================|" << endl;
    }
    
    [B]int Matrix::FillMatrix( )
    {
     for (counter1 = 0; counter1 < 2 ; counter1++)
     {
     for (counter2 = 0; counter2 < 2 ; counter2++)
     {
     cout << "Geben Sie den Wert von " << counter1 + 1 << " " << counter2 + 1 << " an: ";
     cin >>[COLOR=Red] matrix[counter1][counter2];[/COLOR]
     
     }
     
     }
     return 0;
    }[/B]
    
    [B]
    void Matrix::ShowMatrix()
    {
     cout << "Ihre 2 X 2 Matrix hat die folgenden Werte: "<<endl;
     
    {
     for (counter1 = 0; counter1 < 2 ; counter1++)
     { cout << endl;
     for (counter2 = 0; counter2 < 2 ; counter2++)
     {
     
     cout << "\t" << [COLOR=Red]matrix[counter1][counter2][/COLOR];
     
     }
     cout << endl << endl;
     }
     
    }
    
    }[/B]
    
    void Matrix::CalcMatrixRow ( )
    {
     row1 = *pointer1 + *pointer2; // pointer1 = matrix [0][0] ; pointer2 = matrix [0][1]
     row2 = *pointer3 + *pointer4; // pointer3 = matrix[1][0]
    
     cout << "\nAddition der Zeilen ergibt: \n\n\t" << row1 << "\n\t" << row2 << endl << endl;
    }
    
    void Matrix::CalcMatrixColumn ()
    {
     column1 = *pointer1 + *pointer3; //pointer3 = matrix [1][0]
     column2 = *pointer2 + *pointer4; // pointer2 = matrix[0][1] ; pointer4 = matrix[1][1]
    
     cout << "Addition der Spalten ergibt: \n\n\t" << column1 << "\t" << column2 << endl << endl;
    
    
    }
    Main CPP


    Code:
    #include "Matrix.h"
    
    int main ()
    {
     Matrix Obj1;
     Obj1.ShowMessage();
     Obj1.FillMatrix();
     Obj1.ShowMatrix();
     Obj1.CalcMatrixRow();
     Obj1.CalcMatrixColumn();
    
     return 0;
    }
     
  2. 31. Mai 2008
    AW: Zeiger auf mehrdimensionale array ?

    Wenn ich dich richtig verstanden habe, einfach den Pointer auf das erste Element das
    Erste Element des Array setzen und einfach mt ++ incrementieren:

    Code:
    int Matrix::FillMatrix( )
    {
     [B]int *ptr = &matrix[0][0]; // Pointer auf das erste Element setzen[/B]
     
     for (counter1 = 0; counter1 < 2 ; counter1++)
     {
     for (counter2 = 0; counter2 < 2 ; counter2++)
     {
     cout << "Geben Sie den Wert von " << counter1 + 1 << " " << counter2 + 1 << " an: ";
     cin >>[B] *ptr; // Werteingabe verlangen auf der aktuellen Position auf den der Pointer zeigt[/B]
     [B]ptr++; // Pointer incrementieren[/B]
     }
     
     }
     return 0;
    }
    
    Ich verstehe aber nicht ganz den Sinn dahinter warum willste die Elemente über ein Pointer
    ansteuern wenn es über den Index einfacher geht.

    Mfg Rushh0ur
     
  3. 31. Mai 2008
    AW: Zeiger auf mehrdimensionale array ?

    könntest du mir erklären warum man den pointer auch noch hochzählen lässt?

    pointer auf das erste Element setzen, okay verstehe ich.
    cin >> *ptr ist mir auch klar.

    aber wieso den zeiger hochzählen lassen?

    wenn du den hochzählst, ändert sich dann auch die adresse auf die er zeigt ?

    am anfang zeigt er auf matrix[0][0].
    dann zählst du den pointer eins hoch. folgt daraus dann automatisch "matrix[0][1]" ?
     
  4. 31. Mai 2008
    AW: Zeiger auf mehrdimensionale array ?

    Wenn man einen Pointer "hochzählt" verschiebt sich die Addresse um die Größe des Pointertyps,
    in diesem Fall int und die Bytegröße von int ist 4, also könnte man in dem Fall
    ptr++ mit ptr += 4 vergeleichen.....
    Bei einem Array muss man wissen das sich die Wert im Speicher nacheinander Hinterlegt sind:

    Beispiel man hat int Matrix[2][2] dann sind die Werte mit dem "niederwertigen" Index beginend folgend hinterlegt
    (Addresse und Daten erfunden nur um sich Bildlich vorzustellen):
    Code:
    Addresse | Daten (hexdecimaal)
    0x0048DE20 | [COLOR="Red"]0000 0005[/COLOR] [COLOR="SeaGreen"]0000 0009[/COLOR]
    0x0048DE28 | [COLOR="Blue"]0000 000A[/COLOR] [COLOR="DarkOrange"]0000 000F[/COLOR]
    
    Variable | Addresse | Wert
    [COLOR="Red"]Matrix[0][0] | 0x0048DE20 | 5[/COLOR]
    [COLOR="SeaGreen"]Matrix[0][1] | 0x0048DE24 | 9[/COLOR]
    [COLOR="Blue"]Matrix[1][0] | 0x0048DE28 | 10[/COLOR]
    [COLOR="DarkOrange"]Matrix[1][1] | 0x0048DE2C | 15[/COLOR]
    
    Folglich muss man also einen Pointer auf ein Array nur incrementieren um zum nächsten Element
    zu gelangen. Dadurch kann man auch ganz einfach Pointercalucaltionen durchführen mann muss
    dazu nur die Startaddresse des Array wissen, die Grö0e der einzelnen Element und je nach dem Längenangaben des Arrays....

    Mfg Rushh0ur
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.