Pewnie w używanej prze Cię implementacji DIR jest typem niekompletnym, to znaczy że definicja struktury jest ukryta, a kompilatorowi znana jest tylko nazwa. To pozwala Ci na tworzenie wskaźników i referencji ale nie obiektów. Nie ma potrzeby tworzenia przez ciebie obiektów typu DIR podczas korzystania z funkcji z <dirent.h>. Funkcja opendir ma dostęp do definicji DIR więc może go stworzyć, a Tobie zwraca tylko wskaźnik.