Forum: Mikrocontroller und Digitale Elektronik avr-gcc Wie funktionieren pointer ?


von Dennis (Gast)


Lesenswert?

Wie funktionieren denn Pointer bei avr-gcc ?

Tut das so ?

void zwei(int *p) {
  p++;
}

void eins(void) {
  int i;
  zwei(i);
}

Ist nur ein simples Beispiel. Ich möchte, dass Änderungen in der 
Funktion zwei auch Auswirkungen auf die Variable in eins haben. Die 
Variante mit Rückgabe bringt mir nichts. Danke.

mfg
Dennis

von Falk B. (falk)


Lesenswert?

@  Dennis (Gast)

>Wie funktionieren denn Pointer bei avr-gcc ?

So wie überall auf C-Compilern.

>void zwei(int *p) {
>  p++;
>}

Klar. Aber das macht nicht was du denkst. Das erhöht den Pointer, nicht 
den variableninhalt. Das macht man so, Stichwort Dereferenzierung.

*p++;

>void eins(void) {
>  int i;
>  zwei(i);

Hier meckert der Compiler, weil du eine Variable übergibst, und keinen 
Pointer. Eher so

  zwei(&i);

>Funktion zwei auch Auswirkungen auf die Variable in eins haben. Die

Nennt sich Call by reference.

MFG
Falk

von Dennis (Gast)


Lesenswert?

Ah okay, dann also so:

void eins(int *p) {
  *p++;
}

void hop(void) {
  int i;
  zwei(&i);
}

Und wie macht man das ganze mit einem Struct ?

typedef struct
{
  int  a;
  int  b;
} test_t;

void eins(test_t *p) {
  *p.a++;
}

void hop(void) {
  test_t i;
  zwei(&i);
}

Danke.

mfg
Dennis

von dummy (Gast)


Lesenswert?

>void eins(test_t *p) {
>  *p.a++;
>}


 p->a++;

von Falk B. (falk)


Lesenswert?

@ Dennis (Gast)

>Und wie macht man das ganze mit einem Struct ?

>void eins(test_t *p) {
>  *p.a++;

Mit sowas sollte man seeehr vorsichtig sein, du wärst ganz sicher nicht 
der Erste, der sich damit in Knie schiesst. Die Reihenfolge der 
Operatoren ist in C manchmal sehr kryptisch definiert, also besser 
Klammern setzen. Es geht auch.

  p->a++;
  (*p.a)++

Ohne Gewähr!

MFG
Falk

von Mike (Gast)


Lesenswert?

> (*p.a)++

Also ich würde sagen das muss so aussehen:

(*p).a++

"." hat eine höhere Wertigkeit als "*".

von Dennis (Gast)


Lesenswert?

Super. Jetzt weis ich bescheid :-) Danke an alle.

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.