/// Iterates over immutable references to array elements using `.iter()`.
/// This ensures the original array is not consumed or modified.
pub fn print_elements<const N: usize>(arr: &[i32; N]) {
println!("--- Immutable Iteration ---");
// .iter() produces references (&i32) to each element
for item in arr.iter() {
println!("Element reference: {:p}, Value: {}", item, item);
}
}
/// Iterates over mutable references to array elements using `.iter_mut()`.
/// This allows modifying the elements in place via dereferencing (`*item`).
pub fn double_elements<const N: usize>(arr: &mut [i32; N]) {
println!("--- Mutable Iteration ---");
// .iter_mut() produces mutable references (&mut i32)
for item in arr.iter_mut() {
// Dereference the mutable reference to mutate the actual value on the stack
*item *= 2;
}
}
fn main() {
// Initialize a mutable array on the stack
let mut numbers = [10, 20, 30, 40, 50];
// 1. Immutable reference iteration
print_elements(&numbers);
// 2. Mutable reference iteration
double_elements(&mut numbers);
// Verify the modifications
println!("Array after mutation: {:?}", numbers);
// 3. Alternative concise syntax using `&` in a `for` loop
println!("--- Idiomatic loop borrowing ---");
for num in &numbers {
print!("{} ", num);
}
}
/*
run:
--- Immutable Iteration ---
Element reference: 0x7ffc6b83c994, Value: 10
Element reference: 0x7ffc6b83c998, Value: 20
Element reference: 0x7ffc6b83c99c, Value: 30
Element reference: 0x7ffc6b83c9a0, Value: 40
Element reference: 0x7ffc6b83c9a4, Value: 50
--- Mutable Iteration ---
Array after mutation: [20, 40, 60, 80, 100]
--- Idiomatic loop borrowing ---
20 40 60 80 100
*/