It's the function's memory address as you already stated.
You can imagine that every variable, object, function - even each line of code - has a distinct address in the memory. When your program executes and hit's a function, it's "jumping" to that address and executes the code which is present there (this is a really rough approximation - If you like to learn more about it, follow this link).
Static is kind of an edge case. While there are global functions, and object methods (which belong to the object itself) static functions belong to class they are defined in. They are only once in memory no matter how many objects there are (0-infinite).
Passing functions as parameters (without any restrictions of being static or non-static) are quite useful when programming complex scenarios.
Imagine you like to write a "generic sort" function for objects. How could you implement just the sort without knowing the object (and therefore the attributes) or the order (ascending, descending)? This is when function parameters come in. You can define your sort function to work with a function callback that handles the data retrieval from the object as well as how to "compare" objects with each other. It also allows you to change behavior with a parameter (e.g. the operation in a calculator program. There are always two operands and only the operation changes).