I think it works as follows. BlitzMax knows how parameters should be passed based on the declaration of the function pointer.
myfunc has one integer parameter. So a call to myfunc(5) pushes a 5 onto the stack and then jumps to the address in myfunc.
myfunc2 has no parameters so it simply jumps to the specified address.
Both fuction calls jump to address in hi. This retrieves one value from the stack and prints it. If myfunc2() prints a 5 then that just means that nothing disturbed the stack since the call to myfunc(5).
myfunc has one integer parameter. So a call to myfunc(5) pushes a 5 onto the stack and then jumps to the address in myfunc.
myfunc2 has no parameters so it simply jumps to the specified address.
Both fuction calls jump to address in hi. This retrieves one value from the stack and prints it. If myfunc2() prints a 5 then that just means that nothing disturbed the stack since the call to myfunc(5).