It's actually a really practical design pattern and it's known as a jump table. It's more of a common design pattern in purely functional languages like Haskel and Lisp and a equally powerful design pattern highly used in lesser functional languages like Javascript, Python and Ruby (no, C is not a functional language and neither is C++, the prior is a procedural language with the latter being an OOP/procedural language)
However the rest of your concerns in large remain valid. As part of the design pattern all the possible functions _should_ take all the same arguemnts.
FYI: i emphasize should because it's language dependent wether it should or shouldn't but in C/C++ they have to take the same arguments.
All you do is create an array of function pointers and populate the array with pointers to functions you will want to call. You can then pass then call them by offset
You can see a running example i wrote up in 5 seconds here:
http://codepad.org/r6x6VD4o
"If art interprets our dreams, the computer executes them in the guise of programs!" - SICP

“If at first, the idea is not absurd, then there is no hope for it” - Albert Einstein