Array und Zeiger Deklaration



  • Hallo,
    was passiert mit folgenden Ausdrücken ? Warum muss man noch static schreiben, wenn es sich sowieso um globale Variablen handelt ? Wird den beiden Zeigern die Adresse des jeweiligen Arrays zugewiesen ???

    /Konstante/
    #define Elemente 10

    /*Globale Variablen*/
    static int Array1[Elemente], Array2[Elemente];
    static int *eingabeFeld = Array1;
    static int *vergleichsFeld = Array2;



  • Original erstellt von zweistein:
    Warum muss man noch static schreiben, wenn es sich sowieso um globale Variablen handelt ?

    muss man nicht, static sagt nur aus, dass der deklarierte Name nicht in anderen Übersetzungseinheiten (sprich .c files) sichtbar ist, im gegensatz zu extern Deklarationen

    **
    Wird den beiden Zeigern die Adresse des jeweiligen Arrays zugewiesen ???
    **

    jup



  • Erstmal Danke.

    Weil der Code von diesem Programm nur in einer .h Datei steht, kann ich static dann überall herausnehmen ?

    Jetzt habe ich eine Funktion hinzugefügt und schon wieder eine Frage:

    /*Konstante*/
    #define Elemente 10
    
    /*Globale Variablen*/
    static int Array1[Elemente], Array2[Elemente];
    static int *eingabeFeld = Array1;
    static int *vergleichsFeld = Array2; 
    
    /*Funktion*/
    static void
    testVergleichsFeld() {  /*Funktion, die in main () aufgerufen wird*/
    int count;
    for(count = 0; count < Elemente; count++)
    vergleichsFeld[count] = 0;
    

    ist in der Funktion vergleichsFeld (): vergleichsFeld ein Zeiger auf die Zeigervariable *vergleichsFeld der die Adresse von feld2 hat und somit die 10 "Feldindizes" in dieser aufgerufenen Funktion mit 0 belegt und dieses dann mit dem Arraynamen [count] belegt ?



  • man könnte doch aber auch für:

    /*Globale Variablen*/
    static int Array1[Elemente], Array2[Elemente];
    static int *eingabeFeld = Array1;
    static int *vergleichsFeld = Array2;

    sagen, dass z.B. *eingabeFeld auf das erste Element von Array1 zeigt, oder ?



  • Original erstellt von zweistein:
    **
    Weil der Code von diesem Programm nur in einer .h Datei steht, kann ich static dann überall herausnehmen ?

    ist in der Funktion vergleichsFeld (): vergleichsFeld ein Zeiger auf die Zeigervariable vergleichsFeld der die Adresse von feld2 hat und somit die 10 "Feldindizes" in dieser aufgerufenen Funktion mit 0 belegt und dieses dann mit dem Arraynamen [count] belegt ?*

    1. Was besagt die one definition rule (ODR)?
      Wenn du das weisst, dann kannst du mir sicher auch erklaeren, warum man keinen Code in eine Header Datei schreibt.

    mit static kompiliert es zwar, aber die variablen sind 'private' in JEDER uebersetzungseinheit. dh JEDE uebersetzungseinheit hat die gleichen variablen (allerdings NICHT die selben)

    1. verstehe ich nicht.
      testVergleichsFeld setzt lediglich alle Elemente des Arrays Array2 auf 0

    Array1 ist gleich mit &Array1[0]
    Array1 ist somit ein Zeiger (oder besser die adresse) auf/des ersten Elementes des Arrays



  • sagen, dass z.B. *eingabeFeld auf das erste Element von Array1 zeigt, oder ?

    genau...

    ist in der Funktion vergleichsFeld (): vergleichsFeld ein Zeiger auf die Zeigervariable *vergleichsFeld der die Adresse von feld2 hat

    Wieso soll die Variabel "vergleichsFeld" in der Funktion testVergleichsFeld
    eine andere sein als ausserhalb? vergleichsFeld bleibt vergleichsFeld... das
    ist dieselbe...

    und somit die 10 "Feldindizes" in dieser aufgerufenen Funktion mit 0 belegt

    jup.. wobei das mit memset() besser ginge ("man memset" im google)

    und dieses dann mit dem Arraynamen [count] belegt ?

    und dann mit was belegt? mit [count] dereferenzierst du eigentlich den Pointer
    an stelle "count" ... nichts anderes..

    Meiner Meinung nach gehören in eine C-Header keine Definitionen... sondern
    nur Deklarationen (also keine Variabeln).
    ... und ausserdem würde ich ohnehin versuchen, ohne globale Variabeln auszukommen!!



  • Vielen extra Dank für die Kommentare und Kritik.

    Die Funktion wird doch auch ohne static void auskommen, oder ?


Anmelden zum Antworten