Source: https://www.cise.ufl.edu/~mschneid/files/Group Summer 2013/C opaque pointers.pdf