INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 1 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Variablenname mit *
12.07.2019, 19:42
Beitrag #1
Variablenname mit *
Hallo Forumsgemeinde
ich habe in einem heruntergeladenen Sketch Variablennamen mit einem *:
Code:
void leseDS3231zeit(byte *sekunde, byte *minute,byte *stunde, byte *wochentag, byte *tag, byte *monat, byte *jahr) {
  Wire.beginTransmission(DS3231_ADDRESSE);
  Wire.write(0);                                                                // DS3231 Register zu 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_ADDRESSE, 7);                                         // 7 Byte Daten vom DS3231 holen
  *sekunde = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *stunde = bcdToDec(Wire.read() & 0x3f);
  *wochentag = bcdToDec(Wire.read());
  *tag = bcdToDec(Wire.read());
  *monat = bcdToDec(Wire.read());
  *jahr = bcdToDec(Wire.read());
}
Die Bedeutung dieser Sterne ist mir nicht klar. Ist das eine spezielle Konvention die beachtet werden muss?
Freundliche Grüsse
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.07.2019, 20:02
Beitrag #2
RE: Variablenname mit *
Programmierung/_Weitere_Grundelemente/_Zeiger

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.07.2019, 20:14
Beitrag #3
RE: Variablenname mit *
Hallo Andreas,
es handelt sich hierbei um ein Verfahren der Übergabe von Variablen, genannt "Call by Referenz". Das heißt, es werden nicht die Variablen selbst übergeben, sondern es werden nur die Adresse der bereits im Hauptprogramm definierten Variablen übergeben. Der Stern ist hierbei der sogenannte "Dereferenzierungsoperator".
Der Aufruf der Funktion würde dann lauten:
leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr);
Das &-Zeichen steht für den Adressoperator (Referenzoperator) und weist die Funktion an, die Adresse der Variablen an die Funktion zu übergeben.
Gruß
Retian
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.07.2019, 20:19
Beitrag #4
RE: Variablenname mit *
Hallo Fips
danke für deine spontane Antwort - da eröffnet sich noch eine völlig neue Welt für mich...
Andreas
übrigens: du hast eine interessante Webseite - ich habe gerade Post aus China mit "LILYGO® D1 Mini V3.0.0 WIFI" und "NodeMcu Lua CH340G V3 Based ESP8266 WIFI".
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.07.2019, 22:53 (Dieser Beitrag wurde zuletzt bearbeitet: 12.07.2019 23:01 von Tommy56.)
Beitrag #5
RE: Variablenname mit *
(12.07.2019 20:14)Retian schrieb:  Der Stern ist hierbei der sogenannte "Dereferenzierungsoperator".
Das ist falsch. Der Rest der Beschreibung ist richtig.
Erschwerend kommt dazu, das es in C++ mittlerweile echte Referenzen gibt, für die die Zeigerbedeutung nicht gilt. So dass auch der Begriff Referenz nicht mehr in sich selbst eindeutig ist, sondern nur im Sinnzusammenhang.

Der * hat mehrere Bedeutungen. Hier sagt er, dass eine Adresse (ein Pointer/Zeiger) erwartet wird, den Du richtig mit dem & in der Übergabe erklärt hast.
Die Bedeutung als Dereferenzierung ist eine andere, nämlich wenn auf den Wert zugegriffen werden soll, auf den der Zeiger zeigt.

Beispiel:
Code:
int zahl;

void myFunc(int *z) { // hier wird ein Zeiger auf int erwartet
  Serial.println(*z); // der int, auf den z zeigt wird ausgegeben --> Das ist die Dereferenzierung
  *z *= *z; // die (über die Adresse/Zeiger) übergebene Wert der Variablen z (zahl) wird mit sich selbst multipliziert
  // *z ist hier der Wert über die Dereferenzierung, *= ist multipliziere links mit rechts
}

void setup() {
  Serial.begin(115200);
  zahl = 4;
  Serial.println(zahl); // ist jetzt 4
  myFunc(&zahl);  // Übergabe der Adresse von zahl
  Serial.println(zahl); // ist jetzt 16
}

void loop() {}

Der Stern (*) wird in vielen Bedeutungen verwendet, man muss da ganz genau auf das Umfeld und die Wortwahl achten. Derefenzierung ist nur der Zugriff auf den Wert (im weitesten Sinne, das kann auch eine Datenstruktur sein) auf den der Zeiger zeigt.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.07.2019, 07:11
Beitrag #6
RE: Variablenname mit *
(12.07.2019 22:53)Tommy56 schrieb:  Der * hat mehrere Bedeutungen. Hier sagt er, dass eine Adresse (ein Pointer/Zeiger) erwartet wird, den Du richtig mit dem & in der Übergabe erklärt hast.
Die Bedeutung als Dereferenzierung ist eine andere, nämlich wenn auf den Wert zugegriffen werden soll, auf den der Zeiger zeigt.

Hallo Tommy,
deinen Einwand verstehe ich nicht. Genau das passiert doch in der Funktion. Es wird da doch auf den Wert zugegriffen, der als Adresse (= Pointer) übergeben wurde. Auch in der Literatur wird bei der Erklärung von "Call by Referenz" dabei von Dereferenzierung gesprochen, z.B. hier: http://openbook.rheinwerk-verlag.de/c_vo...er_006.htm
Gruß
Retian
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.07.2019, 09:05
Beitrag #7
RE: Variablenname mit *
Ich hatte Deinen Beitrag so verstanden, dass Du den Stern im Funktionskopf als "Dereferenzierungsoperator" bezeichnest, da Du Dich im Beitrag nur mit dem Funktionskopf beschäftigt hast.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.07.2019, 09:19 (Dieser Beitrag wurde zuletzt bearbeitet: 13.07.2019 09:30 von MartinZ.)
Beitrag #8
RE: Variablenname mit *
Zitat:Hallo Tommy,
deinen Einwand verstehe ich nicht. Genau das passiert doch in der Funktion. Es wird da doch auf den Wert zugegriffen, der als Adresse (= Pointer) übergeben wurde. Auch in der Literatur wird bei der Erklärung von "Call by Referenz" dabei von Dereferenzierung gesprochen, z.B. hier: http://openbook.rheinwerk-verlag.de/c_vo...er_006.htm
Gruß
Retian

Früher wurde in C nur "Call by Value" und "Call by reference" unterschieden.
Call by reference wurde da aber noch mit Zeigern (*) durchgeführt.
Aber später wurden die Referenzen & eingeführt, so dass man die Parameter mit & deklariert.

Von Dereferenzierung spricht man nur im Rahmen des Zugriffs auf Zeigervariablen.
Im Rahmen der Deklaration von Variablen und Parametervariablen heißt das Sternchen
Ab da war der alte Name nicht mehr eindeutig.
Wir sollten jetzt besser Call by pointer sagen, wenn es mit Zeigern gemacht wird.

Echtes Call by Referenz mit & hat den Vorteil, dass beim Aufruf der Funktion kein Zeichen & o.ä. geschrieben werden muss.

Im übrigen sollte man soweit wie möglich die Parameterübergabe mit Call by Value machen. Call by Referenz oder Pointer nur wenn die Funktion die Daten des Parameters ändern muss.

Von Dereferenzierung spricht man nur im Rahmen des Zugriffs auf Zeigervariablen.
Da heißt das * "Zugriff auf den Inhalt, nicht auf die Adresse"
Im Rahmen der Variablendeklaration heißt der Stern " Ist ein Zeiger"
Dabei gehört das * übrigens nicht zum Variablennamen sondern zum Variablentyp.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Variablenname über Schleife deklarieren golden_eagle 9 2.523 12.02.2018 22:36
Letzter Beitrag: golden_eagle

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste