Zeiger und Felder



  • Guten Abend zusammen,

    ich habe eine Frage zu Zeigern und Feldern.
    Gelernt habe ich bisher, dass Felder ja schon Adressen sind.
    Daher brauche ich kein &, wenn ich ein Feld an eine Funktion übergebe.

    Aber ich brauche ein &, wenn ich mit scanf einen Wert einlesen und in einem Feld speichern will...

    Warum ist das so?

    Hier der Beispielcode, es geht um Zeile 11:

    #include <stdio.h>
    
    void eingabeFeld(double *preise)
    {
    	printf("Eingabe von drei Werten:\n");
    
    	int index;
    	for(index = 0; index < 3; index++)
    	{
    		printf("Wert %d: ", index+1);
    		scanf("%lf", &preise[index]);
    	}
    }
    
    void ausgabeFeld()
    {
    
    }
    
    void mittelwertFeld()
    {
    
    }
    
    int main()
    {
    	double preise[3];
    	eingabeFeld(preise);
    	return 0;
    }
    

    Danke und Gruß
    Timmi



  • Liegt das daran, dass ich mit scanf an einen bestimmten Index des Feldes übergeben möchte? An diesem Index des Feldes liegt ja ne Variable und die hat ne Adresse, die ich mit & angeben muss?



  • preise ist die Startadresse des Arrays und auch die Adresse des 1. Elements.
    &preise[n] ist die Adresse des n-ten Elements.

    Eine alternative Schreibweise dafür ist 'preise+n'.

    scanf("%lf", &preise[index]);
    ... ist dasselbe wie ...
    scanf("%lf", preise+index);

    🙂


  • Mod

    Felder sind keine Zeiger, Zeiger sind keine Felder. Vergiss das am besten gleich wieder! Damit bekommst du nur Probleme.
    Was du wissen musst ist, dass Felder automatisch in einen Zeiger auf ihr erstes Element umgewandelt werden, wenn sie Teil eines Ausdrucks sind (außer in ein paar Ausnahmefällen). Aber das ändert nichts da dran, dass sie eine andere Natur als Zeiger haben.

    Fließkommazahlen sind der am wenigsten geeignete Datentyp für Geldbeträge. Geldbeträge sind stets diskret (also vom Verhalten her wie Ganzzahlen *winkwink*), wohingegen Fließkommazahlen ihr bestes geben, sich möglichst nicht diskret zu verhalten.



  • SeppJ schrieb:

    Fließkommazahlen sind der am wenigsten geeignete Datentyp für Geldbeträge. Geldbeträge sind stets diskret (also vom Verhalten her wie Ganzzahlen *winkwink*), wohingegen Fließkommazahlen ihr bestes geben, sich möglichst nicht diskret zu verhalten.

    Besser ist das Rechnen mit einen Ganzzahltyp (in Cent) und Operationen zu vermeiden, bei denen ein Rest entstehen kann.


  • Mod

    Andromeda schrieb:

    Besser ist das Rechnen mit einen Ganzzahltyp (in Cent) und Operationen zu vermeiden, bei denen ein Rest entstehen kann.

    Auch noch vieles andere. Es gilt ja nicht einmal 0.1 + 0.1 + 0.1 + 0.l + 0.1 == 5 * 0.1 (letzteres ist übrigens genau 0.5). Bei den Anwendungsgebieten für Fließkommazahlen ist das recht egal, bei Rechnungen mit Geldbeträgen wohl eher nicht. Ich möchte schließlich auch mit fünfmal zehn Cent bezahlen können, wo 50 Cent erwartet werden.



  • Das Böse an Digitalrechnern ist halt, dass sie die Basis 2 haben. Dafür sollte man Leibniz und Co. posthum die Bürgerrechte aberkennen. 😉


  • Mod

    Andromeda schrieb:

    Das Böse an Digitalrechnern ist halt, dass sie die Basis 2 haben. Dafür sollte man Leibniz und Co. posthum die Bürgerrechte aberkennen. 😉

    Ich wäre dann aber dafür, zur Basis 12 oder 60 zurück zu kehren. Die alten Babylonier wussten wenigstens was von Mathematik, wohingegen die 10 daher kommt, dass einige Bauerntrottel zu dumm waren, ohne Finger zu zählen (dabei hat man sogar praktischerweise genau 12 Fingerglieder, wenn man sie nur nutzen würde).



  • int main() 
    { 
        double preise[3]; 
        eingabeFeld(preise); 
        return 0; 
    }
    

    Andromeda schrieb:

    preise ist die Startadresse des Arrays und auch die Adresse des 1. Elements.

    Das ist eine laienhafte Vereinfachung der Sachlage - die deshalb auch immer wieder zu Unsinnspauschalisierungen wie - array gleich &array - führt.
    Jede Weiterverwendung - d.h. Dereferenzierung - von &array statt array führt zu UB.

    type punning breaks strict aliasing



  • SeppJ schrieb:

    Andromeda schrieb:

    Das Böse an Digitalrechnern ist halt, dass sie die Basis 2 haben. Dafür sollte man Leibniz und Co. posthum die Bürgerrechte aberkennen. 😉

    Ich wäre dann aber dafür, zur Basis 12 oder 60 zurück zu kehren. Die alten Babylonier wussten wenigstens was von Mathematik, wohingegen die 10 daher kommt, dass einige Bauerntrottel zu dumm waren, ohne Finger zu zählen (dabei hat man sogar praktischerweise genau 12 Fingerglieder, wenn man sie nur nutzen würde).

    Ich würde Analogrechner viel besser finden. Also Spannungspegel, statt einer endlichen Menge digitaler Zustände. Damit kannst du in beliebigen Zahlenssystemen ohne Rundungsfehler rechnen, also auch zur Basis pi, e und sqrt(2). 😉


  • Mod

    Andromeda schrieb:

    SeppJ schrieb:

    Andromeda schrieb:

    Das Böse an Digitalrechnern ist halt, dass sie die Basis 2 haben. Dafür sollte man Leibniz und Co. posthum die Bürgerrechte aberkennen. 😉

    Ich wäre dann aber dafür, zur Basis 12 oder 60 zurück zu kehren. Die alten Babylonier wussten wenigstens was von Mathematik, wohingegen die 10 daher kommt, dass einige Bauerntrottel zu dumm waren, ohne Finger zu zählen (dabei hat man sogar praktischerweise genau 12 Fingerglieder, wenn man sie nur nutzen würde).

    Ich würde Analogrechner viel besser finden. Also Spannungspegel, statt einer endlichen Menge digitaler Zustände. Damit kannst du in beliebigen Zahlenssystemen ohne Rundungsfehler rechnen, also auch zur Basis pi, e und sqrt(2). 😉

    Da machst du aber den Fehler in der Annahme, dass der Analogrechner eine unendliche Präzision hätte. Die kann er nicht haben, ganz egal wie gut er gefertigt ist, nicht einmal in der Theorie.



  • SeppJ schrieb:

    Da machst du aber den Fehler in der Annahme, dass der Analogrechner eine unendliche Präzision hätte. Die kann er nicht haben, ganz egal wie gut er gefertigt ist, nicht einmal in der Theorie.

    Das beinhaltet wieder die Frage, ob unsere Wirklichkeit kontinuierlich oder diskret ist.



  • Ob wir nun alle echt sind oder nicht, floats sind für Geldbeträge ungeeignet.


  • Mod

    Andromeda schrieb:

    SeppJ schrieb:

    Da machst du aber den Fehler in der Annahme, dass der Analogrechner eine unendliche Präzision hätte. Die kann er nicht haben, ganz egal wie gut er gefertigt ist, nicht einmal in der Theorie.

    Das beinhaltet wieder die Frage, ob unsere Wirklichkeit kontinuierlich oder diskret ist.

    Das ist egal. Auch ohne Quanten kann der Analogrechner nie unendlich genau funktionieren, da:
    a) Er eine Temperatur hat (theoretische Grenze)
    b) Um unendlich genau zu sein, muss er natürlich auch unendlich genau gefertigt sein (praktische Grenze)


Anmelden zum Antworten