Pointers
All variables in a program reside in memory; the statements
float x;
x = 6.5;
request that the compiler reserve 4 bytes of memory (on a 32-bit computer) for the floating-point variable x, then put the ``value'' 6.5 in it. Sometimes we want to know where a variable resides in memory. The address (location in memory) of any variable is obtained by placing the operator ``&'' before its name. Therefore &x is the address of x. C allows us to go one stage further and define a variable, called a pointer, that contains the address of (i.e. ``points to'') other variables. For example:
float x;
float* px;
x = 6.5;
px = &x;
defines px to be a pointer to objects of type float, and sets it equal to the address of x:
Pointer use for a variable
The content of the memory location referenced by a pointer is obtained using the ``*'' operator (this is called dereferencing the pointer). Thus, *px refers to the value of x.
C allows us to perform arithmetic operations using pointers, but beware that the ``unit'' in pointer arithmetic is the size (in bytes) of the object to which the pointer points. For example, if px is a pointer to a variable x of type float, then the expression px + 1 refers not to the next bit or byte in memory but to the location of the next float after x (4 bytes away on most workstations); if x were of type double, then px + 1 would refer to a location 8 bytes (the size of a double)away, and so on. Only if x is of type char will px + 1 actually refer to the next byte in memory.
Thus, in
char* pc;
float* px;
float x;
x = 6.5;
px = &x;
pc = (char*) px;
(the (char*) in the last line is a ``cast'', which converts one data type to another), px and pc both point to the same location in memory--the address of x--but px + 1 and pc + 1 point to different memory locations. Consider the following simple code.
void main()
{
float x, y; /* x and y are of float type */
float *fp, *fp2; /* fp and fp2 are pointers to float */
x = 6.5; /* x now contains the value 6.5 */
/* print contents and address of x */
printf("Value of x is %f, address of x %ld\n", x, &x);
fp = &x; /* fp now points to location of x */
/* print the contents of fp */
printf("Value in memory location fp is %f\n", *fp);
/* change content of memory location */
*fp = 9.2;
printf("New value of x is %f = %f \n", *fp, x);
/* perform arithmetic */
*fp = *fp + 1.5;
printf("Final value of x is %f = %f \n", *fp, x);
/* transfer values */
y = *fp;
fp2 = fp;
printf("Transfered value into y = %f and fp2 = %f \n", y, *fp2);
}
other links
1. A First Program
2. Let's Compute
3. Loops
4. Symbolic Constants
5. Conditionals
6. Pointers
7. Arrays
8. Character Arrays
9. I/O Capabilities
10. Functions
11. Command-line Arguments
12. Graphical Interfaces: Dialog Boxes
No comments:
Post a Comment