"string" je niz znakova koji na svom kraju ima jos jedan dodatni znak, terminacijski, '\0'. Zadnji znak mora postojat, jer sve funkcije u C-u koje barataju sa nekakvim stringovima, to jest nizovima znakova, primaju pointer na pocetnu adresu tog niza. To je pocetna adresa, a kraj niza oznacava upravo taj terminacijski znak.
Ti ovdje uopce nemas string, nego si deklarirao jedan znak i inicijalizirao ga agregatno, pa si samo u jedan pointer tipa char, strpao memorijsku adresu gdje je lociran taj tvoj znak. Nakon toga ispisujes taj znak, ali preko pointera koji pokazuje na adresnu lokaciju.
Prakticki, (char *) ne mora uopce da pokazuje na nekakva slova ili neke nizove. U programiranju niskog nivoa se koristi upravo radi mogucnosi pokazivanja na 1 byte duzine.
Sta se tice tvog pitanja : ti kad agregatno inicijaliziras "string" u C-u, dakle
char *x = "nesto"; ili
char[] x = "nesto"; kompajler se sam pobrine da alocira dovoljno mjesta za tvoja slovca, kao i zadnje mjesto za term. znak. Kad ides rucno radit, trebas dodatno alocirat taj jedan znak, bas na primjeru za "nesto" :
Code:
char *x = (char *)malloc((sizeof(char) * 5) + 1);
strcpy(x, "nesto");
*(x + 5) = "\0";