In general, no. In specific cases, yes.
There are a couple constructs that some other answers alluded to, and that is pointer-only types. There are a couple pointer-only type constructs that come to mind. If anyone thinks of more I'll add them to the list.
Opaque Types
These are types where the type's implementation is totally hidden to the user. You will typically see a structure typedef in the header, but no implementation of that struct. Because of that you cannot dereference values of these types. All functions that operate on this type take pointers to these types. It is appropriate to add the pointer to the typedef in these situations. You often see these called "handle" types.
typedef struct handle_ * handle;handle get_handle(string s);void mutate_handle(handle h, value v);void release_handle(handle h);
Flexible Array Member Types
Another pointer-only type are types that are defined with flexible array members (FAMs). The last member in a FAM type is an unconstrained array. You are intended to dynamically allocate storage for these types and the flexible array is treated as inline with the structure. You can access fields in a FAM type, but cannot dereference the whole object. It is also appropriate to add the pointer to the typedef here.
typedef struct string { size_t capacity; size_t length; char buffer[];} * string;string string_new(void);size_t string_length(string s);void string_append(string * s, char c);void string_delete(string * s);