funktion_1( &variable++); Wie geht das?

Gast #2144900
Lesenswert?

Hallo!

Ich habe eine Funktion, an die ich die Adresse einer Variablen übergebe 
um sie in dieser zu bearbeiten.

Kann ich in einem Schritt irgendwie den Wert der Variablen beim 
Übergeben verändern?
1
void funktion_1( *variable )
2
{
3
  *variable -= 1;
4
}
5

6

7
// Aufruf:
8

9
funktion_1( &variable++ );

Auch mit Klammern geht es nicht. Geht es überhaupt, wenn ja, wie?
Gast #2144906
Lesenswert?

Wie soll es denn funktionieren ?

Soll variable erst erhöht werden und dann der funktion übergeben werden 
?
Oder soll nach der Abarbeitung von der Funktion die Variable erhöht 
werden ?

Ich glaube im Moment, dass dieses Konstrukt der falsche Ansatz sein 
könnte ...
Persönliche Seite #2144907
Lesenswert?

x++ ist der post-increment-Operator.

Wenn Du die Variable verändern möchtest, und das Resultat der Änderung 
dem Funktionsaufruf übergeben willst, musst Du den 
pre-increment-Operator ++x verwenden.

Bedenke obendrein, daß &variable++ nicht unbedingt das tut, was Du 
erwartest, hier solltest Du mit Klammern sicherstellen, daß das 
geschieht, was Du willst.

Konkret: Möchtest Du die Adresse von variable übergeben und variable 
inkrementieren, oder möchtest Du die Adresse inkrementieren?

In ersterem Falle:

funktion_1(&(++variable));

in letzterem Falle:

funktion_1(++(&variable));
Gast #2144965
Lesenswert?

Hier nochmal eine funktionierende Version. ( mit increment_by kannst du 
sogar um einen bestimmten Wert erhöhen ).
1
uint8_t *increment(uint8_t *var)
2
{
3
    (*var)++;
4
    return var;
5
}
6

7
uint8_t *increment_by(uint8_t *var, uint8_t by)
8
{
9
    (*var) += by;
10
    return var;
11
}

Aufruf über
1
buttons_change_repeat( increment(&repeat_counter) );
#2145173
Lesenswert?

Frank schrieb:
> Hat denn trotzdem einer eine Erklärung, warum das nicht geht mit
>
1
> funktion( &(++variable) );
2
>

Mit & kannst du nur die Adresse eines Objekts im Speicher (Variable) 
beglücken.

++variable ist aber nicht die Variable, sondern ein Ausdruck. Der 
liefert zwar einen Wert als Ergebnis, ist aber selbst keine Variable.

Ebensowenig könnte man von (i+j) die Adresse bilden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren