W kodzie z Twojego pierwszego postu kompilator protestuje, bo nazwa tablicy wprawdzie jest wskaźnikiem ale stałym - nie można go inkrementować.
Możesz stworzyć kopię tego wskaźnika, którą już można inkrementować:
char *namePtr = ntr->name;
while (*(namePtr)++ = *name++);
Lub zamiast while użyć memcpy:
// Wyznacz dlugosc imienia (+ 1 dla koncowego '\0').
int nameLength = strlen(name) + 1;
// Upewnij sie, ze nie przekroczymy zakresu tablicy.
assert(nameLength <= 20); // Tutaj powinno się np. przyciąć name do 20 znaków.
// Skopiuj.
memcpy(ntr->name, name, nameLength);
Po zmianie "char name[20];" na "char *name;" dostajesz "Access violation", bo wskaźnikowi trzeba najpierw przydzielić pamięć :)
W ogóle, podejście z whilem jest mało wygodne bo pętla przy okazji kopiowania imienia modyfikuje też oba wskaźniki "name" i "ntr->name":
// Trzeba zapamietac dlugosc imienia przed wykonaniem sie petli while.
int nameLength = strlen(name) + 1;
// Przydziel pamiec do wskaznika.
ntr->name = malloc(nameLength);
// Skopiuj imie.
while (*(ntr->name)++ = *name++);
// ntr->name (i name tez) wskazuje teraz na ostatni znak imienia ('\0')
// i trzeba go cofnac do jego poczatku:
ntr->name = ntr->name - nameLength;
Z memcpy prościej:
int nameLength = strlen(name) + 1;
ntr->name = malloc(nameLength);
memcpy(ntr->name, name, nameLength);
Użycie wskaźnika zamiast tablicy ma taką zaletę, że użytkownik może podać imię dłuższe niż 20 znaków - program przydzieli dokładnie tyle pamięci ile potrzeba, podczas gdy tablica mogłaby się okazać za mała.