Du solltest das Header-File stdio.h auch in das Header-File für deine Strukturen-Definition includieren.
Also noch mal als Erklärung die Sache mit den Pointern:
Wenn du eine definierte Struktur personendaten hast, kannst du ein Objekt auf zweierlei Arten dafür erstellen.
Variante 1 - Objekt-Variable auf den Stack
Damit sorgst du dafür, das bereits beim Starten deines Programms Speicher für das Objekt auf dem Stack reserviert wird. Du musst dich nicht darum kümmern, dass der Speicher dafür wieder aufgeräumt wird. Sobald der Scope (der Bereich in dem die Objekt-Variable definiert wurde) verlassen wird, ist die Variable nicht mehr gültig. Beim Verlassen des Programms wird der Speicher dafür implizit freigegeben.
Diese Variante ist für Anfänger die einfachere, da man sich eben nicht um die Speicherverwaltung kümmern muss. Es wird aber eines Tages ein Anwendungsfall kommen, wo du mit dieser Variante alleine nicht mehr weiter kommst. Beispiel: Du musst eine Objekt-Variable erstellen, die größer als der Stack ist, der normalerweise für deinen Compiler und dein Betriebssystem definiert ist.
Zugriff auf Elemente der Struktur:
C:
// Da es sich nicht um einen Zeiger handelt, darfst du auch nicht den Referenz-Operator verwenden:
strncpy(p.name, "Hans", sizeof(p.name)-1); // Sicherheitshalber mal die Länge beschränken
Variante 2 - Objekt-Variable auf den Heap
Hier wird lediglich ein Zeiger erstellen. Dieser Zeiger zeigt auf irgendeine Stelle im Speicher. Besser wäre es hier schon mal, den Zeiger mit NULL zu initialisieren, da der Zeiger einen undefinierten Zustand hat.
Möchtest du einen Zeiger tatsächlich als Datenspeicher verwenden, musst du dafür Speicher anfordern. Es gibt Funktionen, die das von sich aus erledigen (z.B. strdup()). was du auf jeden Fall dann machen musst, ist den Speicher wieder freigeben, sobald er nicht mehr benötigt wird. Wie das geht, habe ich weiter oben schon gezeigt.
Zugriff auf die Elemente der Struktur über den Zeiger:
C:
// Da es sich um einen Zeiger handelt, musst du auch den Referenz-Operator verwenden:
strncpy(p->name, "Hans", sizeof(p.name)-1); // Sicherheitshalber mal die Länge beschränken
Fazit:
Das sind absolute C-Grundlagen, du solltest den Unterschied erkennen und verstehen. Mein Gefühl sagt mir, das du Zeiger noch nicht verstanden hast.