When you pass by value, you "create" a second instance of the variable, local only to the function receiving it...
When you pass by pointer/reference you can see it as passing a big neon arrow pointing to the original variable...
thus you can imagine, as no additional memory is allocated or the value is not duplicated, it is much more efficient to pass a pointer/reference rather than by value, however this would mean that the function called would be able to change the value of the variable and have that change reflected back to the original...
To avoid this you could create a new variable in the function containing the value of the pointer passed, but then you are doing exactly the same as passing by value
alternatively... passing
"const int* MyInt"
would pass a pointer and make it constant (not changable)