iterates over the list until you encounter a NULL pointer.
The line *iter = n; dereferences the current iterator (in this case a pointer to the current node and assigns n to it. So this essentially searches for the end of the queue and assigns the the new element to the end.

**((iter)->next)

is not the same as

&((*iter)->next)

the statement (*iter)->next dereferences iter which is a pointer to a pointer to a struct queue_node so that you only have the actual pointer to queue. Then it gets the next field from the queue. The & gives you a pointer to the element that is referenced by next (it is the address operator), whereas your code will give you the actual object that is referenced by ->next.