C has a minimum number of fundamental data types - a single character, a single integer or float, and a few derived data types such as a structure, an enumerated list, and an array. If you want to do much more than that, you make use of pointers.
Pointers allow you to dynamically request memory to store off information for use later. They allow you to create linked lists and other algorithmically oriented data structures.
Pointers are a fundamental tool in developing code in C.
And the main disadvantage is that C provides very little in the way of "protection" for the programmer. It takes the worldview that a programmer that needs care will program carefully. So pointers can be set to values which are not really addresses - and if used, that will result in your application crashing.
Also, pointers are not managed - so if you dynamically allocate some space, store the address in a pointer, and later someone frees that memory, the pointer will continue to have the (now invalid) address as its value. If you use the address, you might cause all sorts of havok.