Bit-fields allow access to individual bits within registers or bytes. They define the number of bits for a field within a structure. Bit-fields are useful for storing Boolean values or device status encoded in bits. Pointers store the address of another variable in memory. They allow passing data to functions without copying values and enable functions to modify caller's variables. Pointer arithmetic can be used to access elements in an array using pointers.