Is there a difference between these two declarations?

const char *str = "Hello";

A pointer to a string of characters. The memory could be allocated anywhere, including read-only memory, and the address is stored as the initialiser for this variable. Technically you can really only manipulate the pointer and not the text string.

const char str[] = "Hello";

An array of charaters that are initliased to the value of the string. Equivalent to initialising as ['H', 'e', 'l', 'l', 'o', '\0']. In this case the memory allocated will definitely be R/W and you can be expected to modify the string.