LECTURE 14: Pointers (Reference: “Pointers and Memory” handouts, available from the course web page)

 

 

Definition: Pointer is a variable that stores an address of another variable

 

Therefore, pointer is just another variable type!!

 

The statement:

int num;

declares integer variable num and reserves space in memory to store its value. Computer also records the address of the reserved memory location.

 

num:

address of num

value of num

 

The statement:

int *nump;

declares nump, a pointer to integer, and reserves space in memory to store its value. The value of nump is address of an integer variable to which nump points to. Computer also records the address of the memory location that stores value of nump.

 

nump:

address of nump

value of nump

 

 

Example 1:

int num;          // value of num is some junk value

int *nump;        // nump is pointer

// value of nump is some junk address

nump = #      // value of nump is address of num variable

*nump = 42;       // value of variable where nump points to becomes 42

                  // because nump points to num, value of num becomes 42!!

 

Example 2:

int a = 1;  // a is declared as integer and its value is set to 1

int b = 2, c = 3;

int *p, *q; // p and q are declared as pointers to integers and

            // their values are some junk addresses

 

p = &a;     // value of p is is address of a

q = &b;     // value of q is address of b

c = *p;     // value of c is the value of variable to which p points to

            // since p points to a, c = 1

p = q;      // value of p equals to value of q, which is address of b

            // so, p becomes pointer to b too

*p = 13;    // 13 is assigned to variable pointed to by p, which is b

            // so, b = 13

 

Example 3:

int *p;     // pointer to integer p is created, its value is some junk address

*p = 42;    // value 42 is saved at the junk address pointed to by b

// this is very dangerous mistake since the junk address can

// hold some very important data which will be corrupted by this

 

 

Functions with Simple Outputs (Section 6.1 from the textbook)

 

Motivation: using the return command a function can return only a single number; using pointers it will become possible for a function with more than one output.

 

Example:

Consider function called separate whose input is a number of type double (e.g. 4.35), and whose output is sign (e.g. +), whole part (e.g. 4), and fractional part (e.g. 0.35).

 

 

 

 

 


Solution: Figure 6.3 (Program That Calls a Function with Output Arguments)

 

/*

 * Demonstrates the use of a function with input and output parameters.

 */

 

#include <stdio.h>

#include <math.h>

 

void separate(double num, char *signp, int *wholep, double *fracp);

 

int

main(void)

{

      double value; /* input - number to analyze       */

      char   sn;    /* output - sign of value   */

      int    whl;   /* output - whole number magnitude of value      */

      double fr;    /* output - fractional part of value      */

 

      /* Gets data   */

      printf("Enter a value to analyze> ");

      scanf("%lf", &value);

 

      /* Separates data value into three parts */

      separate(value, &sn, &whl, &fr);

 

      /* Prints results    */

      printf("Parts of %.4f\n  sign: %c\n", value, sn);

      printf("  whole number magnitude: %d\n", whl);

      printf("  fractional part:  %.4f\n", fr);

 

      return (0);

}

 

/*

 * Separates a number into three parts: a sign (+, -, or blank),

 * a whole number magnitude, and a fractional part.

 * Pre:  num is defined; signp, wholep, and fracp contain addresses of memory

 *       cells where results are to be stored

 * Post: function results are stored in cells pointed to by signp wholep, and

 *       fracp

 */

void

separate(double  num,      /* input - value to be split       */

         char   *signp,    /* output - sign of num     */

         int    *wholep,   /* output - whole number magnitude of num       */

         double *fracp)    /* output - fractional part of num        */

{

      double magnitude;  /* local variable - magnitude of num        */

 

      /* Determines sign of num */

      if (num < 0)

            *signp = '-';

      else if (num == 0)

            *signp = ' ';

      else

            *signp = '+';

 

      /* Finds magnitude of num and separates it into whole and fractional parts */

      magnitude = fabs(num);

      *wholep = floor(magnitude);

      *fracp = magnitude - *wholep;

}

 

Example of program execution:

Enter a value to analyze> 35.817

Parts of 35.8170

  sign: +

  whole number magnitude: 35

  fractional part: 0.8170

 

Explanation of the program:

-          the main function informs separate function of the value of variable value, and addresses of variables sn, whl, and fr.

-          the separate function creates memory space to store num variable (of type double), and pointers signp, wholep, and fracp.

-          value of num will equal the value of value; value of signp will equal the address of sn, value of wholep will equal the address of whl, and value of fracp will equal the address of fr.

-          use of pointers in separate function allows it a direct access to variables sn, whl, and fr. This means that separate can directly read and modify their values. For example,

*signp = ‘-‘;

                directly assigns value of ‘-‘ to sn from the main function.

-          the following figure illustrates the connection between variables in main and separate functions:

 

 

 

 

 

 

 

 

 

 

 


Use of a Single Parameter as Both Input and Output (Section 6.2)

 

By use of pointers it is also possible to use the same parameter as both input and output of a function.

 

Example:

The goal is to ask user to enter 3 numbers and order them in the ascending order. Function order should be used. It swaps the values of two numbers if the first number is larger than the second.

 

Solution: Figure 6.6, Program to Sort Three Numbers

 

/*

 * Tests function order by ordering three numbers

 */

#include <stdio.h>

 

void order(double *smp, double *lgp);

 

int

main(void)

{

        double num1, num2, num3; /* three numbers to put in order    */

 

        /* Gets test data */

        printf("Enter three numbers separated by blanks> ");

 

        scanf("%lf%lf%lf", &num1, &num2, &num3);

        /* Orders the three numbers      */

        order(&num1, &num2);

        order(&num1, &num3);

        order(&num2, &num3);

 

        /* Displays results       */

        printf("The numbers in ascending order are: %.2f %.2f %.2f\n", num1, num2, num3);

 

        return (0);

}

 

/*

 * Arranges arguments in ascending order.

 * Pre:  smp and lgp are addresses of defined type double variables

 * Post: variable pointed to by smp contains the smaller of the type

 *       double values; variable pointed to by lgp contains the larger

 */

void

order(double *smp, double *lgp)     /* input/output */

{

        double temp; /* temporary variable to hold one number during swap */

        /* Compares values pointed to by smp and lgp and switches if necessary    */

        if (*smp > *lgp) {

                temp = *smp;

                *smp = *lgp;

                *lgp = temp;

        }

}

 

Example of program execution:

Enter three numbers separated by blanks> 7.5 9.6 5.5

The numbers in ascending order are: 5.50 7.50 9.60

 

Explanation of the program:

-          in the main function a user is first asked to enter 3 double numbers

-          then, function order is called 3 times. In the first call, the values of num1 and num2 are swapped if num1 > num2. After the three calls to order,  the 3 number entered by the user will be sorted in the ascending order

-          let us suppose we want to solve the swap problem without using functions. Then, the code would look like this:

if (num1 > num2) {

tmp = num1;

num1 = num2;

num2 = tmp;

}

-          why did we use tmp variable?

-          order function is given information about the addresses of two variables from main. This gives it opportunity to read and change their values