Tratar struct como elemento de array y también individualmente

estoy definiendo un array cuyos elementos son un conjunto de variables ya definidas (todas del mismo tipo de estructura). Quisiera poder tratarlos tanto de forma independiente por su nombre como en ciertos casos como elementos de un array.
He definido las variables y depués el array inicializandolo con esas variables. Pero después de asignar valores a las variables, veo que en los elementos del array no se ha cambiado nada.

Seguramente es fallo mio de no entender bien cuándo y cómo se asignan los elementos al array. A continuación el código:

#include <Arduino.h>

struct stPunto {
  char Cod;
  int PosX;
  int PosY;
  int PosZ;
};

struct stPunto PuntoOrigen, PuntoDestino;

stPunto arPuntos[2]{ PuntoOrigen, PuntoDestino };

void IniPunto(stPunto &_Punto, const char _Cod, int _X, int _Y, int _Z);
void MostrarPunto(stPunto &_Punto);

void setup() {
  Serial.begin(9600);

  IniPunto(PuntoOrigen, 'O', 1, 2, 3);
  IniPunto(PuntoDestino, 'D', 10, 20, 30);

  MostrarPunto(PuntoOrigen);
  MostrarPunto(arPuntos[0]);
  MostrarPunto(PuntoDestino);
  MostrarPunto(arPuntos[1]);

  delay(10000);
}

void loop() {
  // put your main code here, to run repeatedly:
}


void MostrarPunto(stPunto &_Punto) {
  Serial.print("Punto: ");
  Serial.print(_Punto.Cod);
  Serial.print("  X: ");
  Serial.print(_Punto.PosX);
  Serial.print("  Y: ");
  Serial.print(_Punto.PosY);
  Serial.print("  Z: ");
  Serial.println(_Punto.PosZ);
}

void IniPunto(stPunto &_Punto, const char _Cod, int _X, int _Y, int _Z) {
  _Punto.Cod = _Cod;
  _Punto.PosX = _X;
  _Punto.PosY = _Y;
  _Punto.PosZ = _Z;
}

El output es:
Punto: O X: 1 Y: 2 Z: 3
Punto: X: 0 Y: 0 Z: 0
Punto: D X: 10 Y: 20 Z: 30
Punto: X: 0 Y: 0 Z: 0

Imagino que es porque en la declaración del array no se asignan las estructuras como elementos sino que se inicializan los elementos con el valor de las estructuras.
¿Cómo podría hacer para conseguir lo que quiero? (definir un array en el que el elemento uno es PuntoOrigen y el dos es PuntoDestino, y poder trabajarlos así o como elementos del array)

Pruebalo asi

#include <Arduino.h>

struct stPunto {
  char Cod;
  int PosX;
  int PosY;
  int PosZ;
};

stPunto PuntoOrigen, PuntoDestino;

stPunto* arPuntos[2]{ &PuntoOrigen, &PuntoDestino };

void IniPunto(stPunto &_Punto, const char _Cod, int _X, int _Y, int _Z);
void MostrarPunto(stPunto &_Punto);

void setup() {
  Serial.begin(9600);

  IniPunto(PuntoOrigen, 'O', 1, 2, 3);
  IniPunto(PuntoDestino, 'D', 10, 20, 30);

  MostrarPunto(PuntoOrigen);
  MostrarPunto(*arPuntos[0]);
  MostrarPunto(PuntoDestino);
  MostrarPunto(*arPuntos[1]);

  delay(10000);
}

void loop() {
  // put your main code here, to run repeatedly:
}

void MostrarPunto(stPunto &_Punto) {
  Serial.print("Punto: ");
  Serial.print(_Punto.Cod);
  Serial.print("  X: ");
  Serial.print(_Punto.PosX);
  Serial.print("  Y: ");
  Serial.print("  Z: ");
  Serial.println(_Punto.PosZ);
}

void IniPunto(stPunto &_Punto, const char _Cod, int _X, int _Y, int _Z) {
  _Punto.Cod = _Cod;
  _Punto.PosX = _X;
  _Punto.PosY = _Y;
  _Punto.PosZ = _Z;
}

arPuntos es un array de punteros a stPunto.
Al inicializarlo con &PuntoOrigen y &PuntoDestino, le pasas la dirección de las variables, y no sus valores..
Entonces cualquier cambio en PuntoOrigen y PuntoDestino aparecerá en arPuntos[0] y arPuntos[1].

Salida

Punto: O  X: 1  Y: 2  Z: 3
Punto: O  X: 1  Y: 2  Z: 3
Punto: D  X: 10  Y: 20  Z: 30
Punto: D  X: 10  Y: 20  Z: 30

Muchas gracias! Me sirve para lo que quería. No quería meterme con pointers (por falta de conocimientos míos), pero lo encuentro una solución muy intuitiva y práctica :slightly_smiling_face: