Keith said:
I believe the standard uses the word "address" as a synonym of a
"pointer value". I don't believe it ever refers to an object of
pointer type as an "address"; only (non-null) values of pointer type
are called "addresses".
That's pretty much the intention. "Address" is not really a useful
term, except for steering the reader's intuition in the right general
direction. The usual IT meaning of "address" is a numerical encoding
used to access the storage location of some information. That's also
what a C pointer value is (apart from a null pointer value). About
the only actual distinction is that a null pointer value might not
correspond to any valid address representation. (But it could..)
The name of a function designates the collection of information used
to implement an invocation of the function. Standard C rules say
that the name of a function is automatically converted into a pointer
(type) to the function in most contexts, and that function calls
(invocations) are always made through pointers to the functions.
So (***foo)(bar) is the same as foo(bar), if foo was declared as a
function designator.