Q:

Confusion with dereference operator

Just to be clear of the facts, I wanted ask
int i = 1;
int *p = &i;
i = *p;

What do you call the operator * on p? is called the dereference operator same as in line 3?

A:

This is an example of a pointer declaration:
int *p = &i;

This is an example of a dereference operator:
i = *p;

Operators apply only to variables, not types, they are not the same thing.

A:

* in this case is not an operator, it's a declarator. When applied to a type it turns it into a pointer to that type.
You can think of int* as a type.
Writing it this way makes it more clear:
int i = 1;
int* p = &i;
i = *p;

A:

int i = 1;
int *p = &i;

The * is part of the syntax of a declaration.  int *p says that p is of type int*.
i = *p;

That * is a dereference operator.
But the fact that both use the same syntax is not a coincidence.  C's (seemingly bizarre) declaration syntax is largely based on the principle that "declaration follows usage".
One way to read the declaration
int *p;

is that it declares that *p is of type int.  It follows from that that p is of type int*.  Similarly:
int *a, b, c[20];

says that *a, b, and c[blah] are all of type int, so a is of type int*, b is of type int, and c is of type int[20].  (Note that the correspondence between declaration and usage isn't perfect; c[20] is just past the end of the array, and doesn't actually exist.)
This is why (at least in one school of thought) the * in a pointer declaration goes next to the identifier, not the type.

