No.
codice:
char * str="ciao";
assegna a str l'indirizzo del literal "ciao", che sta in una locazione di memoria valida per tutta la durata del programma. Come già detto sopra, comunque, dovrebbe essere
codice:
const char * str="ciao";
dato che la modifica della stringa literal puntata da str risulta in undefined behavior (e infatti assegnare un literal ad un char * passa per una conversione deprecata)

Invece
codice:
char str[]="ciao";
è la sintassi abbreviata per
codice:
char str[5]={'c', 'i', 'a', 'o', '\0'};
ovvero, crea un array locale alla funzione corrente, di dimensione tale da poter accogliere tutta la stringa "ciao" e lo inizializza con la stringa in questione.

Le due cose sono estremamente diverse: in un caso hai un puntatore ad un literal - ovvero ad un array globale di char non modificabile ma valido per tutta l'esecuzione del programma; nell'altro, hai un array locale di char, modificabile e limitato allo scope corrente.