*
after a type determines a pointer. There's a good chance that you may never even need to use this.
?
after a type says that it is nullable. See below:
int? a = null;
int b = null; //Compile error
??
is the null coalescing operator. Basically it will give you the right-hand side value if the left-hand side is null.
object a = null;
object b = new Object();
object c = a ?? b;
// 'c' is 'b' because 'a' was null.
I hope that answers your questions. I couldn't tell if you were asking about all of these or only the *
.