A reference (&T) is a borrowed pointer that does not own data and requires lifetimes, while a smart pointer (like Box<T>, Rc<T>) is a data structure that owns its data and implements traits like Deref and Drop for automatic cleanup. Use references for temporary access and smart pointers when you need heap allocation, shared ownership, or custom behavior.
// Reference: borrows data, no ownership
let x = 5;
let y = &x;
// Smart Pointer: owns data, allocates on heap
let z = Box::new(5);