The difference between char *str;
and char str;
is that the first one can only point to a string, and the second one can actually store a string.
When you do something like char *str = "this is a string";
, the string will be stored in a read-only memory area and then the str pointer points to it. That means that you should not (and usually cannot, you'll get a segmentation fault) modify that string.
When you do char str = "this is a string";
then the compiler creates an array of 300 chars and then copies the string into that array. That gives you full control over the contents so the string can be modified or what-not.
Of couse, you can also do something like:
char str = "this is a string";
char *strptr = str;
That way, instead of the pointer pointing to a string in read-only memory, it's pointing to an array that you can modify.
As far as a reasonable limit for a filename and path, the most graceful way to handle it would be to use the PATH_MAX macro defined in limits.h: