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 ) /* … */