И какое различие между char* и char[]?
char* str1 = "Hello world!";
char str2[] = "Hello world!";
Разница между str1 и str2 в том, что str1 - это lvalue, а str2 - нет.
Т.е. с str1 вы можете, например сделать str1 = str1 + 1; а с str2 нет.
С точки зрения памяти:
В случае str1 в памяти хранится 2 сущности: 1) сама строка "Hello world!" 2) указатель, которому присваивается адрес строки. Поэтому вы можете присвоить другое значение указателю.
В случае str2 указателя в памяти нет, есть только строка. Адрес строки знает компилятор и использует его когда нужно. Но присвоить новое значение этому адресу уже не возможно.
Можно считать, что char str[]; это то же что и char * const str;