Вроде бы, что сложного в конструкции:
char * str = "blablabla";
Объявили переменную str и присвоили ей значение из последовательности символов.
Также к примеру происходит и с переменными других типов:
int ii = 123;
Но все не так просто. В случае с int мы точно знаем размер значения (int 32 bytes).
А в случае с char * мы имеем дело с указателем на последовательность байт, и количество байт всегда разное (почти всегда).
Конец последовательности байт это скрытый байт 0, он добавляется всегда в конец цепочки байт.
Таким образом мы имеем дело с объектами с разным размером в памяти. И это важная особенность.
Поэтому строки ИМХО к простым типам данных не относятся.
К тому же строка это последовательность байт в определенной формате ( кодировке ): cp866, utf-8, win-1251,...