c pointer void foo1() { int i = 10; } void foo2() { int i = 10; } int main() { void *f1 = &foo1; void *f2 = &foo2; printf("bytes: %d\n", (unsigned int)foo1 - (unsigned int)foo2); } --- C types printf("char: %dB\nint: %dB\nunsigned int: %dB\nlong long: %dB\n", sizeof(char), sizeof(int), sizeof(unsigned int), sizeof(long long)); --- C array int a[3] = {1, 2, 3}; // an array of 3 int's char b[3] = {'a', 'b', 'c'}; // an array of 3 char's int main() { // first element is at index 0 printf("%d\n", a[0]); a[1] += 1; // use index access *(a+2) = 5; // pointer access printf("%d %d\n", a[1], a[2]); // pointers to array elements printf("a %p a1 %p a2 %p a2 %p\n", a, a+1, a+2, &a[2]); // pointer arithmetic uses type printf("%p %p\n", b, b+1); return 0; } --- little-endian int main() { unsigned int x = 0xdeadbeef; char *byte = (char *)&x; for (int i=0;i<4; i++) { printf("[%d-bit]: %x", i, (unsigned int)byte[i]); } return 0; } --- little-endian casting long long val64 = 0x123456789abcdef; int *ptr32 = (int*) &val64; printf("what do you expect? 0x%x\n", *ptr32);