Some functions work by modifying the values of their arguments. This may be done to pass more than one value back to the calling routine, or because the return value is already being used in some way. C requires special arrangements for arguments whose values will be changed.
You can treat the arguments of a function as variables, however direct manipulation of these arguments won't change the values of the arguments from the calling function. The argument of the called function is just a copy of the calling value. This value is stored in a temporary variable which disappears on return from the function.
Direct changes to the argument variables are confined to the scope of that function. We can solve this problem by passing the addresses of variables to the function. These addresses, or pointers as they are generally known, behave a bit like integer types, except that a limited number of arithmetic operators can be applied to them. They are declared differently to normal types, and we are rarely interested in the absolute value of a pointer. It is what lies at the address which the pointer references which interests us.
To get back to our original function, we pass it the address of a variable whose value we wish to change. The function must now be written to use the value at that address (or at the end of the pointer). On return from the function, the desired value will have changed. We manipulate the actual value using a copy of the pointer.