Forum: PC-Programmierung wann * bei pointer in funktion


von Mike (Gast)


Lesenswert?

hallo,
ich habe eine funktion, wo ich arrays und variablen als pointer übergebe
a, b, c sind arrays, size ist normale variable
1
static void function(uint8_t* a, uint8_t* b, uint8_t* c, uint8_t* size)
2
{
3
  c[0] = a[0] + b[0]
4
  *size = 1;
5
}


Warum muss ich bei size ein * machen und bei den arrays nicht? Arrays 
sind zwar implizit pointer, aber wenn ich dennoch ein sternchen 
vorsetze, bekomme ich einen Fehler (invalid type argument).
Aber der dürfte doch eigentlich egal sein oder nicht?

von Oliver S. (oliverso)


Lesenswert?

Nein, der Fehler ist natürlich nicht egal.

In C werden Funktionsparameter grundsätzlich als Kopie übergeben. 
Überleg dir halt, was das in dem o.a. Fall jeweils bedeutet.

Oliver

von (prx) A. K. (prx)


Lesenswert?

Indizierung ist so definiert:
  a[b] == *(a+b)
Statt
  *size
könntest du also auch
  size[0]
schreiben.

von N. M. (mani)


Lesenswert?

(prx) A. K. schrieb:
> Indizierung ist so definiert:
>   a[b] == *(a+b)

Hm was passiert da wohl wenn a eine Struktur ist die z.B. 100 Byte groß 
ist und ich auf Index b=2 zugreifen möchte?

Beitrag #6442060 wurde von einem Moderator gelöscht.
von Nop (Gast)


Lesenswert?

N. M. schrieb:

> Hm was passiert da wohl wenn a eine Struktur ist die z.B. 100 Byte groß
> ist und ich auf Index b=2 zugreifen möchte?

In beiden Fällen dasselbe. Wenn man einen Pointer um N erhöht, zeigt er 
i.a. nicht etwa N Bytes im Speicher weiter, sondern N-mal seinen 
Datentyp. Das ist demzufolge nur dann identisch, wenn es sich um einen 
Pointer auf einen einbytigen Datentyp wie char handelt.

von N. M. (mani)


Lesenswert?

Atomkraft für den Iran schrieb im Beitrag #6442060:
> wenn a ein Pointer auf ne struct ist dann springt er eine struct weiter
> wenn du a um 1 inkrementierst. Wenn du wirklich nur 1 byte weiter laufen
> willst, must du erst a umcasten zu einem z.B. uchar

Du hast natürlich Recht. Denkfehler von mir.

von Marco H. (damarco)


Lesenswert?

ich glaube so wird er es nicht verstehen...
1
 
2
static void function(uint8_t* a, uint8_t* b, uint8_t* c, uint8_t* size )
3
{
4
5
// size enthält die Adresse von der Variable die du der Funktion übergibst.  
6
  c[0] = a[0] + b[0]
7
8
  *size = 1; // hier weist du der variable die auf size zeigt den wert 1 zu
9
// aber size =1; weist du den pointer size die Adresse 1 zu ! 
10
}

Pointer wichtiges Thema...

von Dirk B. (dirkb2)


Lesenswert?

Mike schrieb:
> Arrays
> sind zwar implizit pointer

In der Funktion sind es keine Arrays sondern (echte) Pointer.

von Rolf M. (rmagnus)


Lesenswert?

Mike schrieb:
> Warum muss ich bei size ein * machen und bei den arrays nicht?

Wenn du auf das zugreifen willst, worauf er zeigt, musst du den Zeiger 
dereferenzieren. Sowohl * als auch [] dereferenzieren den Zeiger.

> Arrays sind zwar implizit pointer, aber wenn ich dennoch ein sternchen
> vorsetze, bekomme ich einen Fehler (invalid type argument).
> Aber der dürfte doch eigentlich egal sein oder nicht?

Nein, denn damit versuchst du, zweimal zu dereferenzieren, einmal mit 
dem * und noch einmal mit dem [].

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.