va_start initializes a va_list ap to point to the current function's arguments. The start-argument argument should be the name of the last fixed parameter in the calling sequence.
va_end cleans up a va_list once it is no longer needed. While failure to use va_end may have no effect on some architectures (in fact, in some cases va_end does nothing at all) on other architectures it may be fatal.
va_arg retrieves the next argument, which is presumed to be of type type. The function must have some way to determine what types to expect, and how many arguments, as this information cannot be extracted from the argument list itself. To rewind, use va_end and then va_start again.
Remember that default C argument promotions occur when passing the variable arguments. There is no run-time checking of any kind, and little to no compile-time checking: if you retrieve a type different from that which was passed using va_arg, you will silently get garbage for that and all subsequent arguments.
va_copy assigns a copy of src to dest. Subsequent operations on either will not affect the other.