Since you apparently did not specifically indicate exactly where you took this documentation, my answer may be a little different from what will be written there, but ideologically it will be close.
The "classic functions" all arguments "in" - that is, incoming. One requirement is imposed on them - they must be readable and if the function suddenly changes inside them, the external code will not know about it. Usually such arguments can be passed directly (for example, just a number), as well as a variable / expression.
But sometimes inside the function you need to pass an argument that can be changed. Yes, classic functions usually return a result, but sometimes this is not enough. In this case, you just need to "out". A classic example is passing a pointer to a variable. A function inside itself can write a value there and the calling code will "see" it.
Moreover, if the in parameter must contain a meaningful value (except if it is not used internally), then out may well be non-initialized.
Some compilers by default consider parameters as in, and for out it is necessary to specify explicitly (Pascal, Delphi, C #). Moreover, the compiler can even check if the value is being returned. Of course, there are always workarounds and you can fool the compiler :).
Look at the classic look of the memory copy function.
void * memcpy ( void * destination, const void * source, size_t num );
Initially, it’s not at all clear what’s what (for novice programmers). But if you say that destination is out, a source and num in, then the situation becomes a little clearer (although the names themselves hint as it were). In this case, as if there is a guarantee that what is transmitted from the source will not change (there, by the way, const hints again). And the fact that it will be stored at the destination address will change - in the same place out.
Summing up. In most cases (if it is with / with ++, an assembler), in / out is just a convention (and there are no such keywords). In other languages, the compiler can check a little (pascal, C # and they even have such words). It is possible that there are programming languages that contain stricter rules and even completely refuse to compile if the declaration is at variance with the code. The gcc compiler has special keywords (these are extensions), which partially implement this as well. Plus, the compiler can believe you and make optimization.