When you use %u in printf it always prints the value of any variable. And you are using string as a variable. In strings, the address of the first character and base address of the string is same. Hence it will always display the base address of the string. For example,
char *p="Help";
printf("%u",p);
will always disply the base address.
And regarding your second question you must know the concept of implicit and explicit initialization.
When you manually give the size of character array it is called as explicit initilization.
e.g. char str[10]="abcdef";
And in other case like char str[]="abcd";, it implicitly takes the length of the string as the size of the character array (in this case 4, starting with 0 to 3 and end as null character '\0').
I hope you understood this.