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


