Fragen zur Funktionsweise eines Arrays



  • Auch auf die Gefahr groben Bahnhofs hin:

    Ein Array ist quasi eine "Sammlung" von "Elementen".

    Wenn Du ein Integer Array hast, stellt es eine Sammlung von Integern dar.

    Stell es Dir vor wie eine Kommode mit mehreren Schubladen.
    Jedes Element des Arrays entspricht einer Schublade (die Schubladen sehen alle gleich aus und sind gleich groß - unterscheiden sich nur durch eine Zahl die vorne draufgemalt ist).
    Die Kommode ist also dieses Array...

    STUDENTEN steht, ganz egal wo Du es einsetzt, einfach nur für die Zahl 10.
    Damit hast du, wie bereits bemerkt, beim deklarieren von noten[] 10 Schubladen "bestellt" ...
    Schublade [0] bis Schublade [9].

    Du kannst also den Inhalt der Schublade ansehen, indem Du sie z.B. mit noten[3] "identifizierst". Deshalb bedeutet STUDENTEN immer noch 10... Studenten steht quasi nur für die Anzahl der bestellten Schubladen und verändert sich nicht.

    index ist jetzt nicht mehr und nicht weniger als die Zahl, die vorne an der Schublade steht, damit klar ist, von welcher der 10 Schubladen Du sprichst.

    Du lässt jetzt Schublade für Schublade etwas hineinlegen (die Note an sich, die der Benutzer eingibt)...

    noten[0] => Schublade "0"
    noten[1] => Schublade "1"
    .
    .
    .

    Du könntest überall, wo STUDENTEN steht auch stattdessen die 10 hinschreiben.

    Die Verwendung von solchen #DEFINEs erleichtert einem z.B. später Programmanpassungen.

    Wenn sich zum Beispiel Dein Chef irgendwann überlegt, dass Du ab jetzt 15 Noten und nicht 10 Noten erfragen sollst, musst Du dann nicht suchen, wo die Anzahl der Noten jetzt überall benutzt wird, sondern kannst einfach statt
    #define STUDENTEN 10
    ->
    #define STUDENTEN 15
    schreiben

    damit ersetzt der Compiler in Deinem Quellcode dann einfach jedes STUDENTEN mit 15 statt bisher mit 10...

    Noch Fragen?



  • Sauber erklärt, merci. Jetzt versteh ichs 🙂 .

    Eine Frage is noch offen.
    Man soll Arrays genauso wie Variablen bei der Definition initialisieren, weil der Wert der einzelnen Array-Elemente bei Programmstart sonst unbestimmt ist.

    Beispiel
    int noten [STUDENTEN] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    Wenn ich aber jetzt Arrays mit 1000 Elementen habe, wie kriege ichs hin, dass ich mit einem Schlag alle 1000 Elemente zB mit 0 initialisieren kann?
    Wäre doch Wahnsinn, wenn ich 1000 Nullen eingeben müßte?!



  • int arr[1000] = {0};
    


  • HighLigerBiMBam schrieb:

    int arr[1000] = {0};
    

    So schaut's mal aus!

    Natürlich könnte man das auch noch auf mehrdimensionale Arrays ausweiten, aber das ist nichts für die erste Nacht nach dem Kennenlernen von Arrays ;-P

    Wenn Du Dein Notenprogramm mal im Debugger bemühst, hat Dein Microsoft Gedöns-Programm sicherlich auch eine Nette Darstellung für das int array noten[] für Dich parat.

    So wie also

    int noten[10] = { 0 };
    

    Folgendes tut:

    noten[0] = 0;
    noten[1] = 0;
    noten[2] = 0;
    ...
    noten[9] = 0;
    

    sorgt

    int noten[5][10] = { 0, 0, 0, 0, 0 };
    

    oder aber

    int noten[5][10] = { { 0 } };
    

    für:

    noten[0][0] = 0;
    noten[0][1] = 0;
    ...
    noten[0][9] = 0;
    noten[1][0] = 0;
    ...
    noten[4][9] = 0;
    

    Das kann man natürlich noch beliebig in die Länge ziehen ;o)



  • ChrisIT schrieb:

    ...

    int noten[5][10] = { { 0 } };
    

    ...

    Eine Klammer reicht auch da.

    int noten[5][10][6][3] = {0};
    


  • cool 🙂

    Siehste ma, wie ich keine Ahnung hab.
    danke dir 🙂



  • HighLigerBiMBam schrieb:

    Eine Klammer reicht auch da.

    int noten[5][10][6][3] = {0};
    

    Aha, und wieso meckert dann mein Compiler?

    warning: missing braces around initializer
    warning: (near initialization for ‘noten[0]’)

    => Zwei Klammern sind Pflicht, nur für ungenaue M$-Compiler ist das so in Ordnung.



  • und ich hatte mich schon gewundert und auf mein Unerfahrenheit vertraut 🤡



  • keineah schrieb:

    => Zwei Klammern sind Pflicht, nur für ungenaue M$-Compiler ist das so in Ordnung.

    Ich kann das Gegenteil nicht ausschließen, vielleicht ist es auch nur ein MSC feature.

    und ich hatte mich schon gewundert und auf mein Unerfahrenheit vertraut

    Es gibt so viel Feinheiten man kann sie nicht alle kennen vor allem, wenn man einen Compiler gewöhnt ist.



  • Naja... Ich code C im 'vi' auf Suse 7.3 oder 9.0 und kompiliere mit einer gcc-Version, die gefühltermaßen an meinem 12. Geburtstag entwickelt wurde und ich bin fast 30 ;o)

    Also bin ich keinen besonderen Service des Compilers gewöhnt und kenne auch nur das maken unter linux.

    In C# läuft halt alles "etwas" anders ab.



  • @ChrisIT - genauso wie du die ein- & mehrdimensionalen Arrays & ihre Initialisierung angeführt hast, wirds in meinem Buch gemacht. Der an letzterer Position notierte Index, in deinem Fall die 10 Elemente, wird immer als erster initialisiert.

    int noten[5][10] = { { 0 } };
    

    Mehrdimensionale Arrays sind gerade dran bei mir, also das Buch fakelt hier nich lange rum, von wegen morgen o übermorgen durchmachen*lach* 😃


Anmelden zum Antworten