2016-05-06 9 views
-1

Ich lese den Code unten, ruft das erste Segment read_temperature, die einen Temperatursensor liest.Funktionszeiger in c - Verständnis

Ich versuche es zu verstehen.

  1. Ist read_temperature() ein Zeiger auf eine Funktion? Was bringt das?

  2. read_temperature nimmt die Adresse der Länge?

  3. Warum ist es erforderlich, tempbuff [] für alle Nullen mit memset() zu initialisieren.

  4. Was macht temp_reading&0xff?

  5. Warum ist es notwendig, *templength = 5; am Ende zu tun?

statisch int Länge; static unsigned Adresse

address = (unsigned int)read_temperature(& length); 
PRINTF("Temperature [%x] and its length is [%d] \r\n",address,length); 

Zweite Segment:

uint8_t tempbuff[8]; 

uint8_t * read_temperature(int *templength) 
{ 

} 
+0

„Was soll das temp_reading & 0xFF tun“ ... das scheint das Problem zu zeigen, ist nicht speziell über diese „Funktionszeiger“ aber Sie Weiß nicht C. – usr2564301

Antwort

0

Nein, read_temperature ist eine Funktion, die einen Zeiger auf ein uint8_t zurückgibt.

Wie beim Argument wird die Übergabe von Argumenten in C durch den Wert durchgeführt, was bedeutet, dass der Wert in die Argumentvariable kopiert wird. Um durch Verweis zu emulieren, wird ein Zeiger auf eine Variable verwendet, auf diese Weise kann die Funktion den Zeiger dereferenzieren, um auf das zuzugreifen, worauf der Zeiger zeigt (die Variable in der aufrufenden Funktion). Wenn also die Funktion *templength = 5 ausführt, setzt sie die Variable length in der aufrufenden Funktion auf den Wert 5.

Die Initialisierung des Puffers wird wahrscheinlich so ist es keine Werte aus früheren Anrufe oder Anrufe zu anderen Funktionen, die den gleichen globalen Puffer verwendet.

1
  1. Nein, read_temperature ist eine gewöhnliche Funktion dass gibt einen Zeiger.

  2. templength wird als Zeiger geleitet, so daß read_temperature das Ziel in der Anrufer ändern kann, wie es am Boden tut, wenn er setzt es auf 5.

  3. Da die ersten Elemente 5 manuell eingestellt werden, der memset Aufruf wird wirklich nur für die letzten 3 Elemente benötigt. Es erleichtert auch die Einstellung des einzustellenden Teils, ohne sich um die anderen Elemente kümmern zu müssen.

  4. temp_reading&0xff maskiert die niedrigwertigen 8 Bits von temp_reading und erzwingt den Rest von 0. Es ist eine bitweise UND-Operation.Wie bereits erwähnt, teilt es dem Anrufer mit, wie viel von tempbuff definiert ist. Der Anrufer übergibt die Adresse einer int Variable, und nach der Rückkehr dieser Variablen enthalten 5.