forgive my ignoricy, but if I understand correctly there are 3 ways for passing function parameters

1. call by value - which make a temp object -> do not change my value
2. using pointers
3. using reference

2 & 3 do change the value, but what is the difference between them?
is one of them more efficent than the other?
is any of them do a copy operation for the entire struct being send as parameter (like in call by value)?

thank you very much
avi (123)