People will look at you funny if you talk about pass by reference in C; the orthodoxy is that everything is passed by value, because when you use a pointer, what you are doing is passing a memory address. Manipulating memory addresses directly is commonplace in C, so it makes sense to regard them as values, and not just references to the data they contain.
References (which do not exist in C) and pointers are not quite the same thing, because while a pointer can serve as (the equivalent of) a reference (hence, it can be dereferenced), it has more uses beyond that. So you would say, "I have a pointer to a struct which I passed to a function. I now need to pass it again to another function." If you consider that for a moment, the answer to your question should be clear.*
Do I need to pass it again by reference, or can I just pass it like a 'normal' variable, by value and derefence it. I think I can just pass it normally.
You don't need to dereference pointers to structs, you can just use pointer notation with it:
Code:
struct whatever {
int x;
};
struct whatever a, *p = &a;
a.x = 666; // normal struct notation uses .
p->x *= 2; // pointer to struct notation uses ->
* yes, you just pass the same address (pointer) on.