9. Is NULL always equal to 0(zero)?
The answer depends on what you mean by “equal to.” If you mean “compares equal to,” such as
if ( /* … */ )
{
p = NULL;
}
else
{
p = /* something else */;
}
/* … */
if ( p == 0 )
then yes, NULL is always equal to 0. That’s the whole point of the definition of a null pointer.
If you mean “is stored the same way as an integer zero,” the answer is no, not necessarily. That’s the most common way to store a null pointer. On some machines, a different representation is used.
10. What does it mean when a pointer is used in an if statement?
Any time a pointer is used as a condition, it means “Is this a non-null pointer?” A pointer can be used in an if,while, for, or do/while statement, or in a conditional expression. It sounds a little complicated, but it’s not.
Take this simple case:
if ( p )
{
/* do something */
}
else
{
/* do something else */
}
An if statement does the “then” (first) part when its expression compares unequal to zero. That is,
if ( /* something */ )
is always exactly the same as this:
if ( /* something */ != 0 )
That means the previous simple example is the same thing as this:
if ( p != 0 )
{
/* do something (not a null pointer) */
}
else
{
/* do something else (a null pointer) */
}
11. Can you add pointers together? Why would you?
No, you can’t add pointers together. If you live at 1332 Lakeview Drive, and your neighbor lives at 1364 Lakeview, what’s 1332+1364? It’s a number, but it doesn’t mean anything. If you try to perform this type of calculation with pointers in a C program, your compiler will complain.
The only time the addition of pointers might come up is if you try to add a pointer and the difference of two pointers:
p = p + p2 – p1;
which is the same thing as this:
p = (p + p2) – p1.
Here’s a correct way of saying this:
p = p + ( p2 – p1 );
Or even better in this case would be this example:
p += p2 – p1;
12. How do you use a pointer to a function?
The hardest part about using a pointer-to-function is declaring it. Consider an example. You want to create a pointer, pf, that points to the strcmp() function. The strcmp() function is declared in this way:
int strcmp( const char *, const char * )
To set up pf to point to the strcmp() function, you want a declaration that looks just like the strcmp()function’s declaration, but that has *pf rather than strcmp:
int (*pf)( const char *, const char * );
Notice that you need to put parentheses around *pf. If you don’t include parentheses, as in
int *pf( const char *, const char * ); /* wrong */
you’ll get the same thing as this:
(int *) pf( const char *, const char * ); /* wrong */
That is, you’ll have a declaration of a function that returns int*.
After you’ve gotten the declaration of pf, you can #include <string.h> and assign the address of strcmp()to pf:
pf = strcmp;
or
pf = & strcmp; /* redundant & */
You don’t need to go indirect on pf to call it:
if ( pf( str1, str2 ) > 0 ) /* … */