let say abc is a pointer...
when you use abc without asterix then you use address to which abc is pointing,
and when you use *abc with asterix then you use the value which is stored at the address where pointer is pointing to.
so DEREFERENCING is using a pointer with asterix. (USING A VALUE)
and REFERENCING is usning it withlut asterix. (USING ADDRESS)
but you should also know that pointer it self has an adress as well, but in fact on his address is stored the address of object where he is pointing to.
also:
in your example *(abc)... this one is used in combination with other operators whic have higher priority then asterix. for example:
char*(abc) [10] = newchar [10]
is not same as char *abc [10] = newchar [10] //ERROR
in first example you have declared dynamic array and in second exam. pointer to array.
so [] have higher priority than *
that's why u use ()
hope this help.