When the subprogram needs to return data to the caller through the parameter - When you want maximum efficiency (no data copying) - For large data structures where copying would be expensive