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


von Dennis (Gast)


Lesenswert?

Guten Tag an alle Pointer-Spezialisten.

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

Beispiel:
1
uint8_t uart_snd_buffer[100];
2
3
test = build_checksum (uart_snd_buffer, 3);
4
5
uint8_t build_checksum (uint8_t *data, uint8_t bytecount)
6
{
7
  uint8_t checksum = 0;
8
  uint8_t counter;
9
  
10
  for (counter = 0; counter < bytecount; counter++)
11
  {
12
    checksum ^= data[counter];
13
  }
14
  
15
  return checksum;
16
}

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
1
checksum ^= data[counter];
nicht
1
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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dennis schrieb:
> Aber wieso muss ich jetzt bei
1
checksum ^= data[counter];

> nicht
1
checksum ^= *data[counter];

> ? Ich will doch den Inhalt haben.

Weil [] ebenfalls dereferenziert.

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

von Dennis (Gast)


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.

von Nico22 (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

dasselbe wie
1
5["Hello, world!"]

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

von Dennis (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.