This makes only sense if bookPtr was declared as a pointer:
The first example declares a pointer that can hold the address of a char (otherwise said: a pointer to char). The second variant is the declaration of a pointer to int. Thus the asterisk * is used here to declare a pointer.
char * bookPtr;
id * bookPtr;
These statements just declare bookPtr as a variable that can hold an address. Let's assume that you declared it as a pointer to id. Then
declares theBook as an int and stores the value 67 in it. The second line makes bookPtr point to the address of theBook.
int theBook = 67;
bookPtr = &theBook
Now, the second statement:
Here the asterisk is used as a "derefence operator", meaning "the variable where bookPtr points to". We gave it the address of theBook in the previous code-block. Now we are giving this variable (theBook) the value of another variable: theOtherBook.
So, we changed he value of theBook in an indirect way, namely via its pointer. The dereference operator * is therefore also called "indirection operator".