move itself does nothing rather than a static_cast. According to cppreference.com
It is exactly equivalent to a static_cast to an rvalue reference type.
Thus, it depends on the type of the variable you assign to after the move, if the type has constructors or assign operators that takes a rvalue parameter, it may or may not steal the content of the original variable, so, it may leave the original variable to be in an unspecified state:
Unless otherwise specified, all standard library objects that have been moved from are placed in a valid but unspecified state.
Back to your questions, because there is no special move constructor or move assign operator for built-in literal types such as integers and raw pointers, so, it will be just a simple copy for these types. Thus, for question 1, and question 2, a is still valid and not changed after the move. Because C++ does not allow direct assignment for C array, so the code in question 3 does not compile.
--- edit ---
Your original 3rd question is assigning a plain C array to another, which is not allowed by the language.
Your updated 3rd question is different, it embeds a C array in a struct, and now you are assigning a struct to another, which can compile now. Because you does not have move assign operator for your struct, the default assignment operator is called, which does a byte level copying, thus, a is unchanged after the move and assignment.
This happens only if all member of the struct are POD (Plain Old Data). If you add a non-POD member into your struct, the assignment statement will not compile, because it can not use the default "byte level copy" assign operator to copy non-POD member (for example, a string object).
struct S {
std::string something; // non-POD member
int array[100];
};
S a, b;
b = std::move(a); // this line will not compile