让我们把它完全画出来:
int anArray[] = {5,16,33,99}; // 4 values in consecutive addresses
// ----
// anArray -> 5
// ----
// 16
// ----
// 33
// ----
// 99
// ----
int * p = anArray; // A new variable, whose contents points to the address of anArray
// ---------
// anArray -> 5 <-+
// --------- |
// 16 |
// --------- |
// 33 |
// --------- |
// 99 |
// --------- |
// p -> anArray -+
// ---------
printf("*p = %d\n", *p); // prints 5
p++; // increment pointer p to the next element.
// -----------
// anArray -> 5
// -----------
// 16 <-+
// ----------- |
// 33 |
// ----------- |
// 99 |
// ----------- |
// p -> anArray+1 -+
// ---------
printf("Now *p = %d\n", *p); // prints 16
int * q = &anArray[3]; // new pointer variable, points to 4th element of anArray (0-based)
// -----------
// anArray -> 5
// -----------
// 16 <-+
// ----------- |
// 33 |
// ----------- |
// 99 | <-+
// ----------- | |
// p -> anArray+1 -+ |
// ----------- |
// q -> anArray+3 -----+
// -----------
int ** x = &q; // new pointer variable, points to address of q pointer variable
// -----------
// anArray -> 5
// -----------
// 16 <-+
// ----------- |
// 33 |
// ----------- |
// 99 | <-+
// ----------- | |
// p -> anArray+1 -+ |
// ----------- |
// q -> anArray+3 -----+ <-+
// ----------- |
// x -> q ---------+
// -----------
**x = 12; // get address in x (q), then address in q (anArray+3) and write 12 to it
// -----------
// anArray -> 5
// -----------
// 16 <-+
// ----------- |
// 33 |
// ----------- |
// 12 | <-+
// ----------- | |
// p -> anArray+1 -+ |
// ----------- |
// q -> anArray+3 -----+ <-+
// ----------- |
// x -> q ---------+
// -----------
*x = p; // get address in x (q) and write p value to it (anArray+1)
// -----------
// anArray -> 5
// -----------
// 16 <-+ <-+
// ----------- | |
// 33 | |
// ----------- | |
// 12 | |
// ----------- | |
// p -> anArray+1 -+ |
// ----------- |
// q -> anArray+1 -----+ <-+
// ----------- |
// x -> q ---------+
// -----------
**x = 42; // get address in x (q), then address in q (anArray+1) and write a 42 to it
// -----------
// anArray -> 5
// -----------
// 42 <-+ <-+
// ----------- | |
// 33 | |
// ----------- | |
// 12 | |
// ----------- | |
// p -> anArray+1 -+ |
// ----------- |
// q -> anArray+1 -----+ <-+
// ----------- |
// x -> q ---------+
// -----------
q[1] = 9; // get address in q (anArray+1) add one element (anArray+2), and assign 9
// -----------
// anArray -> 5
// -----------
// 42 <-+ <-+ (q[0])
// ----------- | |
// 9 | | (q[1])
// ----------- | |
// 12 | |
// ----------- | |
// p -> anArray+1 -+ |
// ----------- |
// q -> anArray+1 -----+ <-+
// ----------- |
// x -> q ---------+
// -----------