If you declare a variable, its name is a direct reference to its value. If you have a pointer to a variable, or any other object in memory, you have an indirect reference to its value. If p is a pointer, the value of p is the address of the object. *p means “apply the indirection operator to p”; its value is the value of the object that ppoints
*p is an lvalue; like a variable, it can go on the left side of an assignment operator, to change the value. If p is a pointer to a constant, *p is not a modifiable lvalue; it can’t go on the left side of an assignment.
Consider the following program. It shows that when p points to i, *p can appear wherever i can.
[C]
#include <stdio.h>
int main()
{
int i;
int *p;
i = 5;
p = & i; /* now *p == i */
printf(“i=%d, p=%P, *p=%d\n”, i, p, *p);
*p = 6; /* same as i = 6 */
printf(“i=%d, p=%P, *p=%d\n”, i, p, *p);
return 0;
}
[/C]
2. How many levels of pointers can you have?
The answer depends on what you mean by “levels of pointers.” If you mean “How many levels of indirection can you have in a single declaration?” the answer is “At least 12.”
[C]
int i = 0;
int *ip01 = & i;
int **ip02 = & ip01;
int ***ip03 = & ip02;
int ****ip04 = & ip03;
int *****ip05 = & ip04;
int ******ip06 = & ip05;
int *******ip07 = & ip06;
int ********ip08 = & ip07;
int *********ip09 = & ip08;
int **********ip10 = & ip09;
int ***********ip11 = & ip10;
int ************ip12 = & ip11;
************ip12 = 1; /* i = 1 */
[/C]
If you mean “How many levels of pointer can you use before the program gets hard to read,” that’s a matter of taste, but there is a limit. Having two levels of indirection (a pointer to a pointer to something) is common. Any more than that gets a bit harder to think about easily; don’t do it unless the alternative would be worse.
Consider the following program “A circular list that uses infinite indirection”.
[C]
/* Would run forever if you didn’t limit it to MAX */
#include <stdio.h>
struct circ_list
{
char value[ 3 ]; /* e.g., “st” (incl ‘\0’) */
struct circ_list *next;
};
struct circ_list suffixes[] = {
“th”, & suffixes[ 1 ], /* 0th */
“st”, & suffixes[ 2 ], /* 1st */
“nd”, & suffixes[ 3 ], /* 2nd */
“rd”, & suffixes[ 4 ], /* 3rd */
“th”, & suffixes[ 5 ], /* 4th */
“th”, & suffixes[ 6 ], /* 5th */
“th”, & suffixes[ 7 ], /* 6th */
“th”, & suffixes[ 8 ], /* 7th */
“th”, & suffixes[ 9 ], /* 8th */
“th”, & suffixes[ 0 ], /* 9th */
};
#define MAX 20
int main()
{
int i = 0;
struct circ_list *p = suffixes;
while (i <= MAX)
{
printf( “%d%s\n”, i, p->value );
++i;
p = p->next;
}
return 0;
}
[/C]