asignando una cadena a otra cadena

¿Por qué este código no se está ejecutando? ¿Por qué no se asigna str1 a str2? Sé que tengo la opción de usar strcpy pero deseo saber por qué esto no funciona.

#include<stdio.h>
int main()
{
char str1[]="hello";
char str2[10];
str2=str1;
printf("%s",str2);
return 0;
}

Considerando que si utilizo punteros que funciona como aquí ..

#include<stdio.h>
int main()
(
char *s="good morning";
char *q;
q=s;
while(*q!='\0')
{
printf("%c",*q);
q++;
}
return 0;
}

Esto funciona. Ahora la cadena se ha copiado mediante punteros, ¿por qué tanta diferencia?

Respuestas a la pregunta(5)

Su respuesta a la pregunta