Since the compiler knows both the type and size of the array, I'd argue that loop is better written without pointers and without manually setting the iteration limits:
void disp () {
for (const auto &mtr : motors) {
sprintf (s, " %2d %2d %3s %6d %s", mtr.StepPin, mtr.DirPin,
mtr.forward ? "For" : "Rev", mtr.pos, mtr.Desc);
Serial.println (s);
}
}