#include struct combined { int x; int *p; }; char f(char x) { char y = 7; fprintf(stdout, "local x lives at %x\n", &x); fprintf(stdout, "local y lives at %x\n\n", &y); return x+y; } int main(int argc, char **argv) { char x = 'a'; char *p = &x; char **pp = &p; fprintf(stdout, "x lives at %x\n", &x); fprintf(stdout, "p lives at %x\n", &p); fprintf(stdout, "pp lives at %x\n\n", &pp); fprintf(stdout, "&x - 1 is: %x\n", (&x - 1)); fprintf(stdout, "&x + 1 is: %x\n", (&x + 1)); fprintf(stdout, "&x - 15 is: %x\n\n", (&x - 15)); fprintf( stdout, "Memory near x:\n%d %d %d %d\n%d %d %d %d\n%d %d %d %d\n%d %d %d %d\n\n", *(&x - 0), *(&x - 1), *(&x - 2), *(&x - 3), *(&x - 4), *(&x - 5), *(&x - 6), *(&x - 7), *(&x - 8), *(&x - 9), *(&x - 10), *(&x - 11), *(&x - 12), *(&x - 13), *(&x - 14), *(&x - 15) ); fprintf(stdout, "argv lives at %x\n", argv); fprintf(stdout, "*argv lives at %x\n\n", *argv); x = f(x); fprintf(stdout, "f lives at %x\n\n", &f); int *addr = &f; *addr = 3; fprintf(stdout, "A character is %d bytes.\n", sizeof(char)); fprintf(stdout, "An integer is %d bytes.\n", sizeof(int)); fprintf(stdout, "A pointer is %d bytes.\n", sizeof(int*)); fprintf(stdout, "Our struct (int + pointer) is %d bytes.\n", sizeof(struct combined)); }