C/Pointers

From Attie's Wiki
Revision as of 23:44, 8 March 2012 by Attie (Talk | contribs)

Jump to: navigation, search

A helper for people starting out with pointers:

test.c

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
#define P(expr) printf("%10s: 0x%02X\n", #expr, expr)
 
int main(void) {
	char *s = "cba";
	char **p = &s;
 
	P(      s      );
	P(     &s      );
 
	P(      s[0]   );
	P(     *s      );
 
	P(      p      );
	P(     &p      );
	P(      p[0]   );
	P(     *p      );
 
	P(      p[1]   );
 
	P(     *p[1]   );
	P(    (*p)[1]  );
	P(    *(p[1])  );
 
	P(    (*p)     );
	P(    (*p)++   );
	P(    (*p)[0]  );
	P(    (*p)     );
	P(  ++(*p)     );
	P(    (*p)[0]  );
	P(    (*p)     );
 
	return 0;
}

Output

$ gcc test.c -o test && ./test
         s: 0x8048734      <-- the address of the 'c'
        &s: 0xBF893E8C     <-- the address of the variable s
      s[0]: 0x63           <-- the 'c'
        *s: 0x63           <-- the 'c'
         p: 0xBF893E8C     <-- the address of the variable s
        &p: 0xBF893E88     <-- the address of the variable p
      p[0]: 0x8048734      <-- the address of the 'c'
        *p: 0x8048734      <-- the address of the 'c'
      p[1]: 0x8048680      <-- INVALID - the value stored just after the variable p (the program may segfault here)
     *p[1]: 0x55           <-- INVALID - the value stored at location 0x8048680 (again, the program may segfault here)
   (*p)[1]: 0x62           <-- the 'b'
   *(p[1]): 0x55           <-- INVALID - the same as *p[1]
      (*p): 0x8048734      <-- the address of the 'c'
    (*p)++: 0x8048734      <-- the address of the 'c' - the pointer is POST incremented
   (*p)[0]: 0x62           <-- the 'b'
      (*p): 0x8048735      <-- the address of the 'b'
    ++(*p): 0x8048736      <-- the address of the 'a' - the pointer is PRE incremented
   (*p)[0]: 0x61           <-- the 'a'
      (*p): 0x8048736      <-- the address of the 'a'

Memory Map

... ... ... ...
style="color:red"| 0x08 INVALID (MSB) This will probably be different when you run the program
0xBF893E92 0x04 INVALID This will probably be different when you run the program
0xBF893E91 0x86 INVALID This will probably be different when you run the program
0xBF893E90 0x80 INVALID (LSB) This will probably be different when you run the program
0xBF893E8F 0x08 s (MSB)
0xBF893E8E 0x04 s
0xBF893E8D 0x87 s
0xBF893E8C 0x34 s (LSB)
0xBF893E8B 0xBF p (MSB)
0xBF893E8A 0x89 p
0xBF893E89 0x3E p
0xBF893E88 0x8C p (LSB)
... ... ... ...
0x08048737 0x00 '\0'
0x08048736 0x63 'a'
0x08048735 0x62 'b'
0x08048734 0x63 'c'
... ... ... ...
0x08048680 0x55 This will probably be different when you run the program
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox