2016-06-30 29 views
1

Ich habe ein kleines Problem mit C-Syntax. Ich weiß, dassflüchtiger Zeiger auf flüchtiges Zeichen. zusätzliches statisches Schlüsselwort

volatile char * volatile foo; 

erzeugt einen flüchtigen Zeigervariable auf einen flüchtigen char zu schreiben.

In meinem Verständnis bedeutet das erste volatile, dass der Zeiger auf ein flüchtiges Element wegen des Teils "volatile char" zeigt. Das zweite volatile bedeutet, dass der Zeiger "foo" selbst flüchtig ist.

Ist diese Annahme richtig?

Was wird

static volatile char * volatile bar; 

tun?

Angenommen, dass die obige Anweisung korrekt ist, sollte sie einen flüchtigen Zeiger auf ein flüchtiges statisches Zeichen deklarieren. Mein Problem dabei ist, dass es für einen Zeiger nicht relevant ist zu wissen, ob die Zielvariable statisch ist oder nicht. Dies erklärt wahrscheinlich einen statischen + flüchtigen Zeiger auf ein flüchtiges Zeichen.

Allerdings ist angenommen, dass dies richtig ist, der erste flüchtige würde sich auf den Zeiger und der zweite auf die Daten beziehen.

Welche ist die korrekte Annahme? Was macht jeder Volatile?

Dank

Antwort

2

In meinem Verständnis bedeutet das erste volatile, dass der Zeiger auf ein flüchtiges Element wegen des Teils "volatile char" zeigt. Das zweite volatile bedeutet, dass der Zeiger "foo" selbst flüchtig ist. Ist diese Annahme richtig?

Ja. Jeder Typ-Qualifier (volatile und/oder const und/oder restrict) auf der linken Seite der * bezieht sich auf die spitzigen Typ, während jeder Typ Qualifier auf der rechten Seite bezieht sich auf den Zeigertyp selbst. Dies gilt nur für Typqualifizierer.

static (sowie extern, auto usw.) sind Storage-Klasse-Spezifizierer, die nur mit variabler Dauer und Umfang betreffen. Sie beziehen sich immer auf den deklarierten Variablentyp selbst, in diesem Fall den Zeiger.Es wäre nicht sinnvoll, einen Speicherklassen-Bezeichner für die Daten mit spitzem Zugriff anzugeben, da diese Daten nicht in dieser Zeile, sondern in einer anderen Zeile deklariert werden.

Beachten Sie auch, dass Sie immer eine Zeigervariable mit mehr Typ-Qualifikationsmerkmalen deklarieren können, als dem spitzen Typ entspricht, aber niemals mit weniger. Dies ist wichtig bei der Implementierung const Korrektheit.

+0

Danke. Hat mir sehr geholfen: D – GNA

0

dies erklärt also wahrscheinlich eine statische + flüchtigen Zeiger auf einen flüchtigen char

sicherlich die meisten, ja.

jedoch davon ausgegangen, das der erste flüchtige korrekt auf den Zeiger bezieht und bei

Nope die zweite wies auf die Daten würden. static bedeutet nur, dass bar statisch ist. Es hat nichts mit Volatilität zu tun. So ist beispielsweise static char * volatile bar ein flüchtiger statischer Zeiger, während static volatile char *bar ein statischer Zeiger auf ein flüchtiges Zeichen ist.