Zeiger Problem



  • Dann hast du einen zu alten Compiler.
    Wahrscheinlich heißt es bei dir noch

    #include <iostream.h> // alte Headerdatei noch mit ".h"
    


  • Was hat das denn jetzt mit iostream zu tun?

    So wie's Kóyaánasqatsi gepostet hat funktionierts doch.

    void neu(char zeigerxy[8][8]) 
    {
    	zeigerxy[7][7] = 'C';
    } 
    
    int main() 
    {  
        char xy[8][8];
    	xy[0][0] = 'A';
    	xy[0][1] = 'B';
    
        neu(xy);									// xy ist ein Zeiger auf das erste Element des Arrays
    
    	std::cout<<xy[0][0]<<xy[0][1]<<xy[7][7];	// Ausgabe: ABC
    }
    


  • Ja es funktioniert.
    Deswegen Danke

    Jedoch ma ne Frage.

    Der stern * und das & müssen doch bei Zeiger genutzt werden sonst funktioniert das doch eigentlich ne. Wieso hier doch?



  • Der Stern und das Ampersand haben etwas mit Zeigern zu tun. Das Ampersand kommt aber auch bei Referenzen vor und hat also nicht unbedingt was mit Zeigern zu tun.

    Du kannst mit dem Ampersand die Adresse einer Variable "auslesen".

    Kannst Du mir sagen, was deine "neu" funktion für einen Sinn hat?

    lg, freakC++



  • Das ist "Syntax Sugar", das heißt, dass die Sprache etwas bietet, was eine Sache vereinfacht.

    Zum Beispiel der Zugriff auf das Array:

    #include <iostream>
    
    int main()
    {
        int a[2];
    
        a[0] = 50; // Syntax Sugar
        a[1] = 100;
    
        std::cout << a[0] << ", " << a[1] << std::endl;
    
        *a = 20; // Ohne Syntax Sugar
        *(a + 1) = 40;
    
        std::cout << *a << ", " << *(a + 1) << std::endl;
    
        return 0;
    }
    


  • hhhhh spricht die enge Beziehung zwischen Array und Pointer an. Du kannst ein Array leicht mit einem Zeiger durchlaufen, indem du einfach mit den Adressen der einzelnen Elemente arbeitest. Du kann dann einfach durchiterieren:

    *(a + 1) = 40;

    bzw

    *(a + i) = 40; //i == integer

    lg, freakC++

    PS.: Verbessert mich, wenn ich daneben liegen sollte 🙄



  • Hi,

    ich weis das man mit dem & die Adresse ausließt.
    und über das E-Buch c++ 21 Tage hab ich über Zeiger einiges gelesen.

    Und da ich über eine Funktion "neu" Variablen bearbeiten will die in "main" wieder ausgegeben werden sollten musste ich eigentlich Zeiger nehmen, da die variable xy in "main" local ist und somit in "neu" zwar bei der Übergabe bearbeitet werden kann, aber die bearbeitete Version dannach ne in "main" verfügbar ist. so war die Teorie was mir diese Beispiele hier sagten:

    // Listing 9.5 Zeigt die Uebergabe als Wert     
    #include <iostream.h>
    void swap(int x, int y);
    int main()
    {
    int x = 5, y = 10;
    cout << "Main. Vor Vertauschung, x: " << x << " y: " << y << "\n";
    swap(x,y);
    cout << "Main. Nach Vertauschung, x: " << x << " y: " << y << "\n";
    eturn 0;
    }
    void swap (int x, int y)
    {int temp;
    cout << "Swap. Vor Vertauschung, x: " << x << " y: " << y << "\n";
    temp = x;
    x = y;
     y = temp;
    cout << "Swap. Nach Vertauschung, x: " << x << " y: " << y << "\n";
    }
    

    Main. Vor Vertauschung, x: 5 y: 10Swap. Vor Vertauschung, x: 5 y: 10Swap. Nach Vertauschung, x: 10 y: 5Main. Nach Vertauschung, x: 5 y: 10

    // Listing 9.6 Demonstriert die Uebergabe als Referenz
    #include <iostream.h>
    void swap(int *x, int *y);
    int main()
    {int x = 5, y = 10;
    cout << "Main. Vor Vertauschung, x: " << x << " y: " << y << "\n";
    swap(&x,&y);
    cout << "Main. Nach Vertauschung, x: " << x << " y: " << y << "\n";
    return 0;
    }
    void swap (int *px, int *py)
    {
    int temp;
    cout << "Swap. Vor Vertauschung, *px: " << *px << " *py: " << *py  << "\n";
     temp = *px;
     *px = *py;
     *py = temp;
    cout << "Swap. Nach Vertauschung, *px: " << *px << " *py: "<<*py  << "\n";   
     }
    

    Main. Vor Vertauschung, x: 5 y: 10Swap. Vor Vertauschung, *px: 5 *py: 10Swap. Nach Vertauschung, *px: 10 *py: 5Main. Nach Vertauschung, x: 10 y: 5

    das es leichter ist durch zu "durchiterieren" ist mir neu und werd ich mir jetzt auch merken, aber zu den zwei code bausteinen, der code der jetzt funktioniert entspricht doch dem ersten oder? und da geht es ne.



  • Zu deinem Anfangscode:

    char* zeigerxy[8][8] müsste ein zweidimensionales Array aus Zeigern auf char sein, während &xy ein Zeiger auf ein zweidimensionales Array von chars ist. xy ist intern nichts anderes als ein char *, wenn du es an eine Funktion übergibst (Achtung: _nicht_ char **), daher wird dein Arrayinhalt mit der Lösung von Kóyaánasqatsi nicht kopiert.



  • Gut, hab mich schon gewundert warum normale Zeiger immer funktionierten und bei Arrays glei gar nix mehr und wie muss es lauten damit es funktioniert?
    (mit Zeigern)



  • GAS schrieb:

    Gut, hab mich schon gewundert warum normale Zeiger immer funktionierten und bei Arrays glei gar nix mehr und wie muss es lauten damit es funktioniert?
    (mit Zeigern)

    Was heißt hier "mit Zeigern"? char xy[8][8] _ist_ ein Zeiger, bloß sieht es in der Deklaration nicht danach aus. Wenn du unbedingt Sternchen verwenden willst, kannst du ja &*xy übergeben 😃 .



  • Gut wieder was gelernt

    danke



  • Du solltest bei Arrays und Zeigern in C immer etwas aufpassen, denn es gibt einige Tücken.
    Beispiel:
    char a[5] ist ein char *, aber
    char a[5][10] kein char **.

    char b[5];
    char *c = new char[5];
    sizeof(b) == 5
    sizeof(c) == 4 oder 8, je nach System

    char *b[5] ist ein Array aus 5 Zeigern, nicht ein Zeiger auf ein Array mit der Größe 5


Anmelden zum Antworten