The difference is that in the first case your pointer does not initialized while in the second case a memory was allocated for an object of type node and its address was assigned to the pointer.
To make the first case to be similar the second case you can write
ok I think I understand now. So with the first pointer:
1 2 3 4 5 6
struct node
{
constchar *snake;
node *tail;
}*p;
I can use *p to iterate through what is in the struct etc but I can't make it do things like adding a new node to the struct or assigning any new elements to the struct without dynamic allocation?