Verständnisfrage zu Beispielcode der der Adafruit_ADXL345 Libary

Hallo,

ich binn gerade dabei mit einem ADXL345 Beschleunigungssensor zu experimentieren.
Dafür hab ich den Beispielcode der Adafruit_ADXL345 Libary vereinfacht:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>

/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(1);

void setup(void) 
{
  Serial.begin(9600);
  Serial.println("Accelerometer Test"); Serial.println("");
  
  /* Initialise the sensor */
  if(!accel.begin())
  {
    /* There was a problem detecting the ADXL345 ... check your connections */
    Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
    while(1);
  }

  /* Set the range to whatever is appropriate for your project */
  accel.setRange(ADXL345_RANGE_16_G);
  // displaySetRange(ADXL345_RANGE_8_G);
  // displaySetRange(ADXL345_RANGE_4_G);
  // displaySetRange(ADXL345_RANGE_2_G);

  /* Display additional settings (outside the scope of sensor_t) */
  
  Serial.println("");
  
}

void loop(void) 
{
  /* Get a new sensor event */ 
  sensors_event_t event;
  accel.getEvent(&event);
 
  
  Serial.println(event.acceleration.x);                                                   //Die Beschleunigung des Events wird auf den Seriellen Monitor geschrieben

  delay(100);
}

Den loop Teil verstehe ich so, dass mit

sensors_event_t event;

ein Objekt erstellt wird, das Verschiedene Variablenwerte aufnehmen kann.
Zum Beispiel für die Beschleunigung in Richtung der x,y oder z-Achse.
Mit

accel.getEvent(&event);

werden die Daten, die aus dem Modul ausgelesen werden dann gespeichert, und zwar in die Variablen des Objekts "event".

Das "&event" gibt deshalb die Speicheradressen der Variablen des Objekts "event" an. Da sollen die Infos, die aus dem Modul kommen reingeschrieben werden, um sie später zum Beispiel mit

event.acceleration.x

verwenden zu können.

Ist das soweit korrekt?
Ich hab etwas in der Art bisher noch nicht gemacht und binn mir noch ein bischen unsicher...

Korrekt

Lässt sich vielleicht mit primitiven Datentypen besser zeigen:

void loop()
{
   int value = 5;
   func(&value);
}

void func(int* value)
{
    *value = 10;
}

func() hat einen Zeiger auf int als Parameter. Die Adresse von value in loop() wird mit dem "Adresse von/Referenz" Operator übergeben. In func() wird value dann mit * wieder dereferenziert und der Wert zugewiesen.

Wenn man das nicht als Pointer übergeben würde, wäre der Funktionsaufruf "call by value" und es würde eine Kopie des Objekts übergeben werden (mit dem impliziten Copy Konstruktor des Objekts). Das kostet bei Objekten ersten Speicher und Zeit für das kopieren und zweitens kann man dann den Zustand nicht in der Funktion ändern, da man eben nicht das Original hat.