mikrocontroller.net

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


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>void eins(test_t *p) {
>  *p.a++;
>}


 p->a++;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> (*p.a)++

Also ich würde sagen das muss so aussehen:

(*p).a++

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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super. Jetzt weis ich bescheid :-) Danke an alle.

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.