Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C++ Funktionen Pointer Anfängerfrage

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.02.2017, 15:29 Uhr
cppanfaenger1



Hallo zusammen,

ich habe eine Frage zum Folgenden Programm. Warum muss bei der ersten Funktion ( void anzahlEinlesen ) vor dem n das "&"-Zeichen gesetzt werden. Ich weiß, dass damit die Adresse des Parameters übergeben wird, allerdings verstehe ich den Sinn noch nicht ganz bzw. warum es ohne nicht funktioniert.


C++:

#include <iostream>
using namespace std;


// Funktionsdeklarationen -- zu vervollständigen
void anzahlEinlesen(int &n);
void werteEinlesen(double *arr, int n);
void werteAusgeben(double *arr);
void werteKopieren(double *quellArray, double *zielArray, int n);
void werteMultiplizieren(double *arr, int n, double faktor);
bool istAufsteigendSortiert(int n, double *arr);


// Funktionsdefinitionen -- zu vervollstädigen
void anzahlEinlesen(int &n)
{
    cout << "Anzahl Werte? ";
    cin >> n;
  
}

void werteEinlesen(double *arr, int n)
{
    for (int i=0; i<n; i++)
    {
        cout << "Wert " << i << "?" ;
        cin >> arr[i];
    }
            
}

void werteAusgeben(double *arr, int n)
{
    cout << arr[0];
    for (int i = 1; i < n; ++i)
        cout << ", " << arr[i];
}

void werteKopieren(double *quellArray, double *zielArray, int n)
{
    for ( int i=0; i<n; i++)
    {
        zielArray[i] = quellArray[i];
    }
}

void werteMultiplizieren(double *arr, int n, double faktor)
{
    for ( int i=0; i<n; i++)
    {
        arr[i] = arr[i]*faktor;
    }
        
}

bool istAufsteigendSortiert(int n, double *arr )
{
    double letzterWert = arr[0];
    for (int i = 1; i < n; ++i) {
        if (arr[i] < letzterWert)
            return false;
        letzterWert = arr[i];
    }
    return true;
}


// main-funktion -- bereits komplett
int main()
{
    int anzahl;
    anzahlEinlesen(anzahl);
    
    double *werte = new double[anzahl];
    // Zahlen einlesen und in werte-Array speichern
    werteEinlesen(werte, anzahl);

    // werte-Array ausgeben
    cout << "Eingegebene Werte: ";
    werteAusgeben(werte, anzahl);
    cout << endl;

    // zweites Array anlegen
    double *doppelteWerte = new double[anzahl];
    // werte-Array in doppelteWerte-Array kopieren
    werteKopieren(werte, doppelteWerte, anzahl);

    // alle Zahlen in doppelteWerte-Array mit 2.0 multiplizieren
    werteMultiplizieren(doppelteWerte, anzahl, 2.0);

    cout << "Verdoppelte Werte: ";
    werteAusgeben(doppelteWerte, anzahl);
    cout << endl;

    delete[] doppelteWerte; // doppelteWerte-Array freigeben

    // pruefe ob die Werte sortiert sind
    if (istAufsteigendSortiert(anzahl, werte)) {
        cout << "Werte sind aufsteigend sortiert." << endl;
    } else {
        cout << "Werte sind nicht aufsteigend sortiert." << endl;
    }
    delete[] werte;// werte-Array freigeben
    return 0;
}



Ich hoffe es nimmt sicher jemand die Zeit, um mir zu helfen

Dieser Post wurde am 16.02.2017 um 15:31 Uhr von cppanfaenger1 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.02.2017, 16:39 Uhr
ao

(Operator)



Zitat von cppanfaenger1:
Hallo zusammen,

ich habe eine Frage zum Folgenden Programm. Warum muss bei der ersten Funktion ( void anzahlEinlesen ) vor dem n das "&"-Zeichen gesetzt werden. Ich weiß, dass damit die Adresse des Parameters übergeben wird, allerdings verstehe ich den Sinn noch nicht ganz bzw. warum es ohne nicht funktioniert.


Weil der Wert, der in anzahlEinlesen eingelesen wird, am Ende aus der Funktion hinaustransportiert werden soll. Der wird ja danach in main weiterverwendet.

Ohne das &-Zeichen würde das anzahl (uninitialisierte Variable -> zufälliger Wert) in den Parameter n von anzahlEinlesen hineinkopiert. Dort würde er von cin überschrieben und anschließend vergessen.

Mit dem &-Zeichen wird nicht der Wert von anzahl kopiert, sondern eine Referenz darauf, d.h. der Schreibzugriff innerhalb von anzahlEinlesen wirkt in Wahrheit nicht auf eine lokale Variable, sondern auf ein Objekt, das außerhalb lebt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.02.2017, 16:47 Uhr
cppanfaenger1




Zitat von ao:
[quote cppanfaenger1]Hallo zusammen,

ich habe eine Frage zum Folgenden Programm. Warum muss bei der ersten Funktion ( void anzahlEinlesen ) vor dem n das "&"-Zeichen gesetzt werden. Ich weiß, dass damit die Adresse des Parameters übergeben wird, allerdings verstehe ich den Sinn noch nicht ganz bzw. warum es ohne nicht funktioniert.


Weil der Wert, der in anzahlEinlesen eingelesen wird, am Ende aus der Funktion hinaustransportiert werden soll. Der wird ja danach in main weiterverwendet.

Ohne das &-Zeichen würde das anzahl (uninitialisierte Variable -> zufälliger Wert) in den Parameter n von anzahlEinlesen hineinkopiert. Dort würde er von cin überschrieben und anschließend vergessen.

Mit dem &-Zeichen wird nicht der Wert von anzahl kopiert, sondern eine Referenz darauf, d.h. der Schreibzugriff innerhalb von anzahlEinlesen wirkt in Wahrheit nicht auf eine lokale Variable, sondern auf ein Objekt, das außerhalb lebt.[/quote]

Danke! Bei dem Beispiel kann ich das "&" auch umgehen indem ich mit einer int Funktion arbeite und in der main Methode die Funktion dann einer Variablen zuweise. Ist das immer möglich?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.09.2017, 20:01 Uhr
SoloMission2017



Bei einer Funktionsdeklaration, wie hier gezeigt, ist der Parameter der Funktion kein Pointer, sondern eine Referenz. Referenzen funktionieren ähnlich wie Pointer - in dem Sinne, dass auf die Adresse einer Variable zugegriffen wird.

Beispiel:

REFERENZ:

1. void eineFunktion(int &zahl);

2. Der Aufruf erfolgt dann in der Form: eineFunktion(irgendeineZahl);
Du übergibst die Variable beim Aufruf der Funktion ohne vorangestelltes '&'- Zeichen.

Zum Unterschied sieht der Umgang mit Pointern wie folgt aus:

POINTER

1. void eineFunktion(int * zahl); (bzw. in deinem Beispiel übergibst du ein Array)
2. Aufruf: eineFunktion(&zahl);

Wenn als Parameter ein Pointer festgelegt ist, stellst du beim Aufruf der betreffenden Funktion dem Variablennamen ein & voran.

Es gibt einen kleinen, aber feinen Unterschied zwischen Pointern und Referenzen. Gerade bei Referenzen ist es beim Aufruf nicht ersichtlich. ob es sich um Call-by-Value oder Call-By-Reference handelt.

Mein Tipp: Benutze Referenzen, wenn am Wert der Variablen keine Änderungen vorgenommen werden sollen ( wenn z.B. nur eine Ausgabe erfolgen soll). Nutze Pointer, wenn du Werte ändern willst. Du musst das nicht tun, hilft dir aber einigermaßen, den Überblick zu behalten.

Ich hoffe, ich konnte etwas zur Erhellung beitragen...🙂

Dieser Post wurde am 16.09.2017 um 20:10 Uhr von SoloMission2017 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.09.2017, 16:51 Uhr
ao

(Operator)



Zitat von ao:
[quote SoloMission2017]Es gibt einen kleinen, aber feinen Unterschied zwischen Pointern und Referenzen. Gerade bei Referenzen ist es beim Aufruf nicht ersichtlich. ob es sich um Call-by-Value oder Call-By-Reference handelt.

In beliebten akademischen Lehrbeispielen vom Kaliber

C++:
void eineFunktion (int & eineVariable);


kann man das tatsächlich nicht erkennen.

Allerdings muss man auch mal sagen: Wer als Dozent derart blödsinnige Bezeichner verwendet und das auch noch seinen Schülern so beibringt, der hat wohl in seinem ganzen Leben noch nie ein wirklich brauchbares Programm geschrieben. Und was solche Theoretiker als "Erkenntnis" verkaufen, das kann man getrost in die Tonne treten.

In realem und gut geschriebenem Quellcode wird durch Kontext und Funktionsnamen schon sehr deutlich, was eine Funktion mit einer Variablen anstellt, so dass es fürs Verständnis auf die genaue Syntax gar nicht mehr ankommt. Leute mit etwas Erfahrung erkennen sowas ohne Mühe. Und gute Lehrer bringen ihren Schülern und Studenten ganz selbstverständlich bei, dass sie nicht nur auf die Syntax, sondern auch auf den Kontext zu achten haben.

Außerdem helfen moderne IDEs dem Programmierer mit kontextsensitiver Hilfe, den Überblick zu behalten. Man muss heutzutage nicht mehr mit dem Windows-Notepad programmieren, das in dieser Hinsicht überhaupt keine Unterstützung bietet.


Zitat:
Mein Tipp: Benutze Referenzen, wenn am Wert der Variablen keine Änderungen vorgenommen werden sollen ( wenn z.B. nur eine Ausgabe erfolgen soll). Nutze Pointer, wenn du Werte ändern willst. Du musst das nicht tun, hilft dir aber einigermaßen, den Überblick zu behalten.

Solche Tipps tragen dazu bei, dass unerfahrene Programmieranfänger sich zu blinden Regelbefolgern entwickeln.

Die Kriterien für die Entscheidung "Pointer oder Referenz" sind andere.[/quote]

Dieser Post wurde am 17.09.2017 um 18:41 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: