You should get an error from:
Code:
char *a_str = "hello";
because that is assigning a pointer value of type (const char *) to a variable defined to have type (char *). The compiler MAY choose to create a private instance of the string literal "hello" just for this. If you had
Code:
const char *a_str = "hello";
const char *b_str = "hello";
you could (probably should) get the exact same pointer value stored in a_str and b_str. However with
Code:
char *a_str = "hello";
char *b_str = "hello";
if it doesn't flag that as a pointer type assignment/initialization error, it should give unique pointer values to each.
So, what if you mean to use const in your definition. Then, what is the practical difference? One makes a pointer object and arranges for it to point to a string literal somewhere. The other makes string space and initializes it. The practicality depends on your usage.
If you need a pointer that at different times may point to different strings, but needs to initially point some first string, the first example (with const) would do well. You can modify the pointer to point to other strings, later.
If you need string space that can be modified in place, but not increased in size, the second example would do well. You would get just enough space to hold the initial value. You may get more, but you cannot depend on that.