Forum: Compiler & IDEs eeprom_read_byte( uint8_t* ), warum ein zeiger uint8_t


von Werner H. (Gast)


Lesenswert?

Hallo zusammen,

Folgendes habe ich im GCC-Tutorial gefunden.
1
uint8_t EEPReadByte(uint16_t addr)
2
{
3
  return eeprom_read_byte((uint8_t *)addr);
4
}
Aber warum aus addr ein Zeiger auf einen uint8_t gemacht?
Die EEProm-Adressen haben doch mehr als 8 bit! es müsste daher doch ein 
Zeiger auf ein uint16_t sein oder ist das wurst, weil Zeiger 
Speicheradressen speichern und diese sind immer gleich lang?!

Oder habe ich hier grundlegend etwas falsch vertanden?

Vielen Dank
Werner

von Stefan E. (sternst)


Lesenswert?

> Die EEProm-Adressen haben doch mehr als 8 bit!

Aber die Daten im EEPROM sind Bytes. Die 16-Bit-Adresse (beachte: addr = 
uint16_t) zeigt auf ein Byte (uint8_t *) im EEPROM.

von Werner H. (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Aber die Daten im EEPROM sind Bytes.
Dann müsste es
1
 return (uint8_t)eeprom_read_byte(addr);
lauten. Oder etwa nicht?

von Stefan E. (sternst)


Lesenswert?

Werner H. schrieb:
>> Aber die Daten im EEPROM sind Bytes.
> Dann müsste es
1
 return (uint8_t)eeprom_read_byte(addr);
> lauten. Oder etwa nicht?

Warum? eeprom_read_byte gibt ein uint8_t zurück. Welchen Sinn soll es 
machen, ein uint8_t in ein uint8_t zu casten?

Und warum lässt du den Cast bei addr weg? Der macht aus dem 
16-Bit-Integer einen Zeiger.

von Michael B. (mb_)


Lesenswert?

Werner H. schrieb:
> Oder habe ich hier grundlegend etwas falsch vertanden?

Jo. Arbeite in deinem C Buch nochmal das Kapitel "Zeiger" durch.

uint8_t* ist ein Zeiger und er speichert eine Adresse eines uint8_t. 
(Kein uint8_t selber)

von Karl H. (kbuchegg)


Lesenswert?

Werner H. schrieb:
> Hallo zusammen,
>
> Folgendes habe ich im GCC-Tutorial gefunden.
>
1
> uint8_t EEPReadByte(uint16_t addr)
2
> {
3
>   return eeprom_read_byte((uint8_t *)addr);
4
> }
5
>
> Aber warum aus addr ein Zeiger auf einen uint8_t gemacht?
> Die EEProm-Adressen haben doch mehr als 8 bit! es müsste daher doch ein
> Zeiger auf ein uint16_t sein oder ist das wurst, weil Zeiger
> Speicheradressen speichern und diese sind immer gleich lang?!

Der Compiler weiß schon wie lang Pointer (und damit Adressen) sind. Das 
braucht man ihm nicht sagen.
Aber bei Adressen ist interessant: An der Stelle im Speicher, von der 
man die Adresse hat, was genau liegt den dort im Speicher?

In deinem Fall: ein uint8_t

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.