Friday, July 10, 2009

Pointers In C Programming Language

Pointers

The C language allows the programmer to ``peek and poke'' directly into memory locations. This gives great flexibility and power to the language, but it also one of the great hurdles that the beginner must overcome in using the language.

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 &ampx 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:

Blog List