[Anfänger]: zweidimisionales Array an Funktion Übergeben.



  • Fricky667 schrieb:

    Zu deiner Verwirrung: Es geht sogar sowas:

    &mein_Array
    

    Aber frag mich nicht warum.
    Adresse von Adresse?
    Ist wohl ein Bug in der C-Grammar-Definition, der nie jemanden gestört hat.

    &mein_Array ist ein Zeiger, der auf das Array zeigt:

    int mein_array[5];
    
    • &mein_array ist ein int(*mein_array)[4] . Ein Zeiger auf das Array als Ganzes.
    • mein_array zerfällt in Ausdrücken zu einem Zeiger auf das erste Element des Array: int* .
    • &mein_array[0] ergibt explizit einen Zeiger auf das erste Element.

    Edit: Mist, der C-Guru hat bereits zugeschlagen.



  • Wutz schrieb:

    Klappe halten wenn man keine Ahnung hat heißt es da.
    Die C-Altvorderen eines Bugs zu verdächtigen kann nur einem Dorftrottel ohne Ahnung aber mit übersteigertem Mitteilungsbedürfnis passieren.

    Ach, mein lieber Proll-Troll ist wieder da. 😃
    Willst du, dass gleich der nächste Thread wegen deiner Scheiße zugemacht wird?



  • Techel schrieb:

    &mein_array ist ein int(mein_array)[4]
    mein_array zerfällt in Ausdrücken zu einem Zeiger auf das erste Element des Array: int
    .

    Gibt es denn eine Situation in der man '&mein_array' nehmen muss und nicht einfach 'mein_array' hinschreiben kann?



  • Ah, folgendes ...

    void test (int(*array)[4]){}
    
    int main()
    {
        int array[4];
        test (&array); // geht
        test (array);  // fehler
    }
    

    Alles klar. Thx Techel!



  • Was soll das gegenseitige angezicke ? Ich dachte das hier wäre ein professionelles Forum und kein Kindergarten a la: "Ich aber kann es besser".

    Noch mal zu meiner Frage die ich aber in der Zwischenzeit im Internet als gelöst gefunden habe.

    Zitat:
    Zeiger und Arrays haben vieles gemeinsam. Tatsächlich setzten die meisten C-Compiler alle Array-Befehle in Zeiger-Befehle um. der Name eines Arrays (also der Variablename) ohne Indexangabe und Adressoperator gibt die Startadresse des Arrays zurück, d.h. die Adresse des ersten Elements.

    Somit ist:

    pointer = &array[0];
    

    gleichwertig mit:

    pointer = array;
    

    Zitat ende.

    test (array);  // KEIN Fehler !!!


  • Mod

    Ein Array ist kein Zeiger, ein Zeiger ist kein Array! Sei unbedingt vorsichtig mit zufälligen Aussagen aus dem Internet, viele Leute haben von C weit weniger Ahnung als sie denken und verbreiten dann gefährliches Halbwissen. Siehe z.B. Fricky667 in diesem Thread. Hier wurden seine Aussagen richtig gestellt. Wenn du anderswo gleichartige Aussagen ohne Korrektur findest, dann bloß, weil es niemand korrigiert hat.

    DirkB hat bereits genau erklärt, worauf es hier ankommt:

    DirkB schrieb:

    &mein_Array[0][0] liefert eine Adresse von einem int . Hier vom ersten Element vom Array

    meinArray liefert eine Adresse von einem int[3][5] . Das ist die Anfangsadresse von dem Array.

    Beide Adressen sind hier identisch, jedoch nicht die Typen. Dies wird jedoch beim Funktionsaufruf verdeckt, so dass die Funktion weiterhin funktioniert.



  • Das war eine gute Diskussion zwischen Techel und mir. Bleib mal locker. 🙂


  • Mod

    Mein Eindruck ist, dass ein großer Teil der Verwirrung im Zusammenhang mit Array und Zeigern von einem fehlenden Verständnis für die verschiedenen Wertkategorien (l- und rvalues) und ungenauer Verwendung von Begriffen, die nicht deutlich machen, welche Kategorie gemeint ist.
    Gerade beim Thema Zeiger ist es einerseits wichtig, anderseits oft unklar, was gemeint ist:
    1. ein Zeigerwert, d.h. ein bestimmtes Bitmuster, dass eine bestimmte Speicherstelle bezeichnet (und hier ist unglücklich, dass wir vom Englischen kommend, von l- und r-Werten reden), oder
    2. ein Zeigerobjekt, also eine Speicherstelle, die einen Zeigerwert (s.o.) speichern kann

    Zeigerwert       | Zeigerobjekt
    verweist auf ein Objekt                         ja               | nein
    änderbar                                        nein             | ja (wenn nicht const qualifiziert)
    ist ein Speicherort                             nein             | ja
    hat eine Adresse                                nein             | ja
    ein Zeigerwert existiert, der darauf zeigt      nein             | ja
    

    Das sind also völlig verschiedene Dinge. Und doch werden beide oft einfach nur Zeiger genannt, vielleicht noch mit wechselnden Bedeutungen innerhalb desselben Satzes/Gedankens. Mit ein bisschen Arraysauce dazu ist es dann kein Wunder, dass Verwirrung resultiert.

    Als Sahnehäubchen obendrauf noch die etwas unsinnige Herangehensweise des C-Standards, die besagt, dass ein lvalue generell in ein entsprechendes (und hier gibt es wesentliche Unterschiede zwischen Arrays und nicht-Arrays) rvalue gewandelt wird, sofern es nicht Operand eines Operators ist, der eben diese Umwandlung unterdrückt. Der Weg von C++ macht mehr Sinn: Ausdrücke stehen zunächst mal nur für sich selbst, falls eine Umwandlung erfordelich ist, wird die erst durch den jeweiligen Operator induziert. Immerhin hat die Art der Interpretation keinerlei Einfluss auf das Verhalten eines Programmes, das sowohl gültiges C als auch C++ ist (außer bei leerem volatile-read).



  • camper schrieb:

    Mein Eindruck ist, dass ein großer Teil der Verwirrung im Zusammenhang mit Array und Zeigern von einem fehlenden Verständnis für die verschiedenen Wertkategorien (l- und rvalues) und ungenauer Verwendung von Begriffen, die nicht deutlich machen, welche Kategorie gemeint ist.
    Gerade beim Thema Zeiger ist es einerseits wichtig, anderseits oft unklar, was gemeint ist:
    1. ein Zeigerwert, d.h. ein bestimmtes Bitmuster, dass eine bestimmte Speicherstelle bezeichnet (und hier ist unglücklich, dass wir vom Englischen kommend, von l- und r-Werten reden), oder
    2. ein Zeigerobjekt, also eine Speicherstelle, die einen Zeigerwert (s.o.) speichern kann

    Manche reden ja von Zeiger und Zeigervariable, wenn sie das unterscheiden wollen. Ersteres ist bei dir der Zeigerwert und letzteres dein Zeigerobjekt.

    Aber im sonst üblichen flapsigen Sprachgebrauch kann "Zeiger" eben beides sein. Da wird das erst durch den Kontext klar, was gemeint ist.

    Was ich aber so richtig doof finde, ist die Formulierung: "irgendwas *zerfällt* in einen Zeiger". Wer hat sich das bloß ausgedacht. 😞


  • Mod

    Fricky667 schrieb:

    Manche reden ja von Zeiger und Zeigervariable, wenn sie das unterscheiden wollen. Ersteres ist bei dir der Zeigerwert und letzteres dein Zeigerobjekt.

    Das ist auch recht. Wer das so verwendet, macht ja klar, dass da ein (wesentlicher) Unterschied besteht: keine Verwirrung.
    Technisch gesehen ist eine Variable ein benanntes Objekt, und die Problematik beschränkt sich ja nicht bloß auf Dinge, die Namen haben - auf diese Feinheiten kommt es aber in der Diskussion in der Regel nicht an, also gibt es dann auch keinen Grund, darauf einzugehen.

    Fricky667 schrieb:

    Was ich aber so richtig doof finde, ist die Formulierung: "irgendwas *zerfällt* in einen Zeiger". Wer hat sich das bloß ausgedacht. 😞

    Denk an radioaktiven Zerfall.
    Für das Verb to decay gibt es leider nur blöde Übersetzungen.
    "Verfaulen" passt ja auch nicht so recht ... obwohl es evtl. Leute von der Verwendung von Arrays abhalten könnte 🤡


Anmelden zum Antworten