In short: yes, you can access static methods with pointers.
To understand this, it is best to better understand what is happening under the hood of the compiler.
For clarity, the compiled program is written to machine code. There is additional information in the compiled program for the “program loader”, but the program itself is just instructions that must be executed by the processor.
When you call the "foo ()" function in C, the C compiler translates this into the processor operation "CALL". The CALL operation is performed in code at the address foo (literally, the memory address or "offset"). Note that since this is a memory address, the name ("foo") is not used. Also note that the linker does not need to know about "foo" for this to work.
When you call the "bar ()" function in C, and the function is in another compilation unit (another C file), the compiler has a small problem, because it does not know where in the program (where in memory) the function should call. That is, he does not know what address to write after the CALL operation. When this happens, it writes code that leaves room for the address, but leaves a note for the linker. The note says the linker "put the bar address here." Therefore, the linker corrects the written program using the memory address. To allow the linker to do this; the compiler writes a table containing each function name and corresponding address in the code.
So what does static do? It just tells the compiler not to write the name and address for the function in the table passed to the linker. A function still exists in the code as a function, but the linker does not know where it is. Any code in one compilation unit will know where the function is located. Thus, any function inside one compilation unit can pass the address of the function as a pointer outside the compilation unit.
The c code for using the function pointer looks something like this:
file1.h
typedef void (* VoidFunctionPointer)(); extern VoidFunctionPointer somethingInteresting; bar();
file1.c
#include "ah" VoidFunctionPointer somethingInteresting; static void foo() {
file2.c
#include "ah" int main(int argC, char ** argV) { bar();
In this code, file2 actually runs a static function from file1. The key is that file2 never needs the name of this function, so the static effect does not affect function pointers.
I can recommend reading Microsoft's description of the PE format (.EXE and .DLL) [here]:
http://msdn.microsoft.com/en-us/library/ms809762.aspx