Oddly, none of the previous answers directly address the question asked in the title.
No, the name of an array is not a pointer to its first element.
In most expressions, an expression that is an array is converted to a pointer to the first element. Because this happens in most expressions, people tend to think of arrays as pointers. However, there are four exceptions. An array is not converted to a pointer when it is the operand of sizeof, _Alignof, or & or when it is a string literal used to initialize an array. Because one of your examples uses an array as an operand of sizeof, it uses the array, not a pointer to the first element.
Thus, in sizeof(str[0]), str[0] is parsed first. In this subexpression, str is not the operand of sizeof, so it is converted to a pointer. Then that pointer is used with the subscript operator, and the result is the first element of the array. Then sizeof evaluates to the size of that element, which is one.
In sizeof(str), str is the operand of sizeof. So it is not converted to a pointer; it is the array. Then sizeof evaluates to the size of that array, which is seven.
Note that this conversion does not just occur for identifiers (names); it occurs for any expression. Thus, if p is a pointer to array, as declared with float (*p)[4];, then *p is an array of four float, so it is converted to a pointer to float (when it is not the operand of sizeof, _Alignof, or &).