Q:

What is this Macro/Pointer declaration doing?

anyone familiar with this macro definition:
#define CrashData                     (*((CRASH_DATA *)CRASHDATA_ADDRESS))

where
CRASH_DATA  is a typedef struct
CRASHDATA_ADDRESS is 0xF3F80UL

I suspect that we are creating a struct variable called CrashData that is placed from the addrees and forward right?
Thank you for your help, Pointer declaration is kind of confusing.

A:

I suspect that we are creating a struct variable called CrashData that is placed from the addrees and forward right?

No, not exactly.
In the first place, there is no variable anywhere in sight.  You spoke correctly when you called the code a macro definition; therefore the code defines a macro named CrashData, which is not at all the same thing as a variable.
So let's look at the macro's replacement text:
(*((CRASH_DATA *)CRASHDATA_ADDRESS))

Starting from the inside, you claimed that CRASHDATA_ADDRESS is 0xF3F80UL, which I interpret to mean that it is actually a macro, with that unsigned long constant as its replacement text.
(CRASH_DATA *) can only be a cast operator, so it is unsurprising to hear that CRASH_DATA is a typedefed type alias, or perhaps a macro expanding to such.  The result of the cast is a pointer to CRASH_DATA.  It might in particular point to a block of memory at the address specified by CRASHDATA_ADDRESS, but the standard only says

the result is implementation-defined, might not be correctly aligned,
  might not point to an entity of the referenced type, and might be a
  trap representation.

the result of the cast is enclosed in parentheses and the dereferencing operator (unary *) is applied to it.  The result of dereferencing a pointer is an lvalue designating the object to which the pointer points.
the dereferenced result is enclosed in parentheses, which serve their ordinary grouping role.  This is useful so that operator precedence does not cause surprising effects where the macro is used.

Overall, then, the intent of the macro seems to be to represent an expression that presents a block of memory starting at CRASHDATA_ADDRESS as if it were an object of type CRASH_DATA.  Since CRASH_DATA is a structure type, you would access its members via the . operator:
if (CrashData.member1 == y) {
    CrashData.member2 = x;
}

Although you might write similar code if CrashData were a variable, it is not a variable, and there are ways in which it would behave differently than a variable.

