mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warum benötige ich hier kein Stern beim Pointer? :-) Bitte um Hilfe


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag an alle Pointer-Spezialisten.

Eine kurze Frage: Wann * vorm Pointer, wann nicht?

Beispiel:
uint8_t uart_snd_buffer[100];

test = build_checksum (uart_snd_buffer, 3);

uint8_t build_checksum (uint8_t *data, uint8_t bytecount)
{
  uint8_t checksum = 0;
  uint8_t counter;
  
  for (counter = 0; counter < bytecount; counter++)
  {
    checksum ^= data[counter];
  }
  
  return checksum;
}

Ich übergebe ja ein Array, da wird ja direkt die Adresse übergeben, 
nicht der Inhalt. In meiner Funktion "build_checksum" habe ich als 
Übergabewert einen Pointer, da ich ja eine Adresse bekomme.

Aber wieso muss ich jetzt bei
checksum ^= data[counter];
nicht
checksum ^= *data[counter];
? Ich will doch den Inhalt haben.

Manchmal steh ich da echt noch auf dem Schlauch. Der Compiler meckert 
mit "*" auf jeden Fall und ohne gehts.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis schrieb:
> Aber wieso muss ich jetzt bei
checksum ^= data[counter];

> nicht
checksum ^= *data[counter];

> ? Ich will doch den Inhalt haben.

Weil [] ebenfalls dereferenziert.

*(foo + i) ist eine alternative Schreibweise für foo[i].

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Weil [] ebenfalls dereferenziert.

Ach quatsch! Echt? :-) Also wenn ich ein Array-Element direkt mit 
"Nummer" anspreche, dann ist definitiv der Inhalt gemeint?

Hab grad in meinem Buch geblättert, es aber nicht gefunden. OK, danke, 
weiß ich wieder was mehr.

Autor: Nico22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stell dir eine Zeichenkette vor:

char *text = "Hallo Welt.";

Möchtest du nun einen einzelnen Buchstaben haben, kannst du das 
ebenfalls über die eckigen Klammern erreichen:

char buchstabe = text[2];

Du erhältst dereferenziert einen char.
Das ist äquivalent zu:

char buchstabe = *(text + 2);

Nico

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und um die Konfusion auf die Spitze zu treiben: die obige Äquivalenz
ist durchaus auch noch kommutativ.  Also ergibt
"Hello, world!"[5]

dasselbe wie
5["Hello, world!"]

Intern macht der Compiler nämlich immer die oben genannte Umwandlung
in die Zeigerarithmetik draus.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK OK :) Ich belasse es bei der ersten Erklärung. Vielen Dank euch!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.