Pointer Variable Declarations and Initialization
Pointer variables contain memory addresses as their values. Normally, a variable directly contains a specific value. However, a pointer contains the memory address of a variable that, in turn, contains a specific value. In this sense, a variable name directly references a value, and a pointer indirectly references a value (Fig. 8.1). Referencing a value through a pointer is often called indirection. Note that diagrams typically represent a pointer as an arrow from the variable that contains an address to the variable located at that address in memory.
Figure 8.1. Directly and indirectly referencing a variable.
Pointers, like any other variables, must be declared before they can be used. For example, for the pointer in Fig. 8.1, the declaration
int *countPtr, count;
declares the variable countPtr to be of type int * (i.e., a pointer to an int value) and is read, "countPtr is a pointer to int" or "countPtr points to an object of type int." Also, variable count in the preceding declaration is declared to be an int, not a pointer to an int. The * in the declaration applies only to countPtr. Each variable being declared as a pointer must be preceded by an asterisk (*). For example, the declaration
double *xPtr, *yPtr;
indicates that both xPtr and yPtr are pointers to double values. When * appears in a declaration, it is not an operator; rather, it indicates that the variable being declared is a pointer. Pointers can be declared to point to objects of any data type.
Common Programming Error 8.1
Assuming that the * used to declare a pointer distributes to all variable names in a declaration's comma-separated list of variables can lead to errors. Each pointer must be declared with the * prefixed to the name (either with or without a space in betweenthe compiler ignores the space). Declaring only one variable per declaration helps avoid these types of errors and improves program readability. |
Good Programming Practice 8.1
Although it is not a requirement, including the letters Ptr in pointer variable names makes it clear that these variables are pointers and that they must be handled appropriately. |
Pointers should be initialized either when they are declared or in an assignment. A pointer may be initialized to 0, NULL or an address. A pointer with the value 0 or NULL points to nothing and is known as a null pointer. Symbolic constant NULL is defined in header file (and in several other standard library header files) to represent the value 0. Initializing a pointer to NULL is equivalent to initializing a pointer to 0, but in C++, 0 is used by convention. When 0 is assigned, it is converted to a pointer of the appropriate type. The value 0 is the only integer value that can be assigned directly to a pointer variable without casting the integer to a pointer type first. Assigning a variable's numeric address to a pointer is discussed in Section 8.3.
Error-Prevention Tip 8.1
Initialize pointers to prevent pointing to unknown or uninitialized areas of memory. |