Standard says*: The operand of the unary * operator shall have pointer type.
Which I think means that, for rvalues, as long as whatever you put after the * isn't a pointer type, it will be multiplication.
Not quite. That's when ALL terms have their importance in a technical document, and especially in standards.
Before the fact it's followed or not by a pointer type, here they talk about the UNARY * operator.
By definition, a unary operator CANNOT have an operand on both of its sides. Otherwise, it's treated as a binary operator. The additional rule is just that as a unary operator, it's only defined as a dereference operator, and thus its operand can only have pointer type.
Take this expression: 'A * B', here the '*' operator can't be the unary *. There are two operands.
Now take this one: A * *B. The second '*' can only be a unary operator: on its left, there is NO operand, just another operator, and it follows that the first "*" can only be a binary operator. Thus this is non-ambiguously "A times dereferenced B", and by the rule above, B must have pointer type. "A * *B" (which of course can be written "A**B", whitespaces don't matter here, it's just less readable for humans if you omit them), if B doesn't have pointer type, is an error and will not compile.
Any expression A * B, whatever the types of A and B, can only be treated as a multiplication in C.
Now consider this:
int A, *B, C;
C = A * B;
There is no ambiguity. GCC will, for instance, tell you: "error: invalid operands to binary * (have 'int' and 'int *')". It will never even consider the "*" here as a unary operator, since it's not used as one.
It may tickle the eye, but it's not ambiguous. It works as any unary operator. You can consider the "-" operator, which also has both forms (unary and binary), to see this.