C-style arrays are part of C++ and appear in low-level and interoperability code, but they decay to pointers easily and do not carry their size into most function calls. Prefer std::array for fixed-size owned storage and std::span later in the course for a non-owning view.
Fixed-size storage with std::array
std::array<T, N> keeps elements contiguously, knows its size, supports iterators, and works with the standard algorithms. Unlike a raw array parameter, it cannot silently lose its extent.
Give difficult types a meaningful name
A using alias improves readability without creating a distinct type. Use it for a domain-relevant spelling, but use a wrapper type when the compiler should prevent mixing two values that happen to have the same representation.
Unpack structured results
Structured bindings, introduced in C++17, let you unpack a pair, tuple, array, or aggregate. Use const auto& when you need to observe an existing object without copying it; plain auto creates new values or moves from an initializer as usual.
Practice: rewrite a raw int values[4] as std::array<int, 4>, then write a function that accepts it by const reference and returns its largest element.