Pointer Related: Array, Structure, Single Pointer (*), Double Pointer (**), Reference (&)
1-D Array: integer
int a[5] = {10,20,30,40,50};
Output
a[0] = 10 &a[0] = 0x5FBFF8E0 a + 0 = 0x5FBFF8E0
a[1] = 20 &a[1] = 0x5FBFF8E4 a + 1 = 0x5FBFF8E4
a[2] = 30 &a[2] = 0x5FBFF8E8 a + 2 = 0x5FBFF8E8
a[3] = 40 &a[3] = 0x5FBFF8EC a + 3 = 0x5FBFF8EC
a[4] = 50 &a[4] = 0x5FBFF8F0 a + 4 = 0x5FBFF8F0
2-D Array: integer
int a[3][2] = {10,20,30,40,50,60}; // or int a[3][2] = { {10,20},{30,40},{50,60}}; // or int **a; /* **a = 10, *(*a+1) = 20 **(a+1) = 30, *(*(a+1)+1) = 40 */
a[x][y] = *(a[x] + y) = *( *(a+x) + y )
Output
a[0][0] = 10 a[0] + 0 = 0x5FBFF8E0 ; a[0][1] = 20 a[0] + 1 = 0x5FBFF8E4
a[1][0] = 30 a[1] + 0 = 0x5FBFF8E8 ; a[1][1] = 40 a[1] + 1 = 0x5FBFF8EC
a[2][0] = 50 a[2] + 0 = 0x5FBFF8F0 ; a[2][1] = 60 a[2] + 1 = 0x5FBFF8F4
a[0] = 0x5FBFF8E0 a + 0 = 0x5FBFF8E0 *(a+0) = 0x5FBFF8E0
a[1] = 0x5FBFF8E8 a + 1 = 0x5FBFF8E8 *(a+1) = 0x5FBFF8E8
a[2] = 0x5FBFF8F0 a + 2 = 0x5FBFF8F0 *(a+2) = 0x5FBFF8F0
char * vs. char []
char ch1[] = "abcde"; printf("0x%X 0x%X \t %s\n",ch1,&ch1,ch1); char *ch2 = "abcde"; printf("0x%X 0x%X \t %s\n",ch2,&ch2,ch2);
Output
ch1(%X) = 0x5FBFF8F2 &ch1 = 0x5FBFF8F2 ch1(%s) = abcde
ch2(%X) = 0xE37 &ch2 = 0x5FBFF8F0 ch2(%s) = abcde
Structure
struct student { char firstname[20]; char *lastname; int score; }; struct student s1 = {"Carlos", "Wang", 100}; printf("%s %s = %d\n",s1.firstname,s1.lastname,s1.score); printf("&s1 = 0x%X\n",&s1); printf("&s1.firstname = 0x%X \t s1.firstname(%%X) = 0x%X \t s1.firstname(%%s) = %s\n",&s1.firstname,s1.firstname, s1.firstname); printf("&s1.lastname = 0x%X \t s1.lastname(%%X) = 0x%X \t s1.lastname(%%s) = %s\n",&s1.lastname,s1.lastname, s1.lastname);
Output
Carlos Wang = 100
&s1 = 0x5FBFF8D0
&s1.firstname = 0x5FBFF8D0 s1.firstname(%X) = 0x5FBFF8D0 s1.firstname(%s) = Carlos
&s1.lastname = 0x5FBFF8E8 s1.lastname(%X) = 0xE1D s1.lastname(%s) = Wang