Wenn du das Ding global machst, bekommst du oft breiteren Code, weil GCC einen direkten Zugriff macht.
Geschieht der Zugriff hingegen indirekt, werden die schlankeren und genauso schnellen Zugriffe via X, Y, oder Z-Reg benutzt. Allerdings kommt hintzu, daß du den Pointer erst beschaffen must.

Zu deinem eigentlichen Problem:
Die Deklaration einer globalen Variablen gehört in einen Header, ihre Definition in einen C-File.

c-file:

Code:
#include "h-file"
// Definition
zeug_t zeug;
...
{
   zeug_t *pzeug = &zeug;
   zeug.a = ...
   pzeug->a = ...
   foo (pzeug);
   foo (&zeug);
}
h-file:
Code:
typedef struct {
...
} zeug_t;

extern void foo (zeug_t*);
// Deklaration
extern zeug_t zeug;
Im obigen Beispiel erzeugt GCC für
zeug.a = ...
leider den gleichen Code wie für
pzeug->a = ...,
Das zu verhindern und GCC den indirekten Zugriff verwenden zu lassen, ist nicht immer einfach.