Your compiler can interpret char *nz = "hello"; to mean one of many things. "hello" could be a static array of chars and nz is pointing to it (this one will run error free) or it could think "hello" is a temporary array of chars and nz points to it (this one will give you a good old seg fault). The fundamental difference between an array and a pointer is that an array has a finite size and a predictable location whereas a pointer is not. Before someone posts how wrong I am, I'll go ahead and point out that there are exceptions however a newbie would best understand what I just said.
char *nz = (char *)malloc(5);