C passes all function parameters by value, period; the formal parameter (in the definition) is a separate object in memory from the actual parameter (in the call). Any updates to the formal parameter have no effect on the actual parameter. You can fake pass-by-reference semantics by using a pointer, but the pointer is passed by value.
True pass-by-reference means that the formal and actual parameters refer to the same object in memory, so any changes to the formal parameter also affect the actual parameter. In practice, a pointer-like object is passed to the subroutine, but that's hidden from the programmer.
C does not support pass-by-reference. C++ supports pass-by-reference with special operators. Old-school Fortran was pass-by-reference.
Global variables are simply visible to both the caller and callee.
Can't speak to pass-by-name or pass-by-alias; never worked with a language that used that mechanism.