/* program to compute the perimeter and area of a rectangle */

#include <stdio.h>

/* compute the perimeter and area of a rectangle, 
   given the lengths of the two sides */
void compute(double side1, double side2, double* pPerimeter, double* pArea)
{
  double lengthPlusWidth = side1 + side2;
  *pPerimeter = 2.0 * lengthPlusWidth;
  *pArea = side1 * side2;

  printf("compute:  addresses, values, and pointer references\n");
  printf("             side1:  address: %lu, value: %lf\n",
          (unsigned long)&side1, side1);
  printf("             side2:  address: %lu, value: %lf\n",
          (unsigned long)&side2, side2);
  printf("   lengthPlusWidth:  address: %lu, value: %lf\n", 
          (unsigned long)&lengthPlusWidth, lengthPlusWidth);
  printf("   pPerimeter:       address: %lu, value: %lu, *pPerimeter: %lf\n", 
          (unsigned long)&pPerimeter, (unsigned long)pPerimeter, *pPerimeter);
  printf("   pArea:            address: %lu, value: %lu, *pArea: %lf\n", 
          (unsigned long)&pArea, (unsigned long)pArea, *pArea);
}

/* demonstrate pointer passing by calling compute and displaying results */
int main()
{
  /* declare variables */
  double length = 5.0;
  double width  = 7.0;
  double perimeter;
  double area;

  /* print header */
  printf("working with a rectangle of width %lf and length %lf\n",
          width, length);

   /* compute desired quantities */
  compute(length, width, &perimeter, &area);

  /* print results */
  printf("the rectangle's perimeter is %lf\n", perimeter);
  printf("the rectangle's area is %lf\n", area);

  printf("main:  variable addresses and values\n");
  printf("   length:      address: %lu, value: %lf\n", 
	 (unsigned long)&length, length);
  printf("   width:       address: %lu, value: %lf\n", 
	 (unsigned long)&width, width);
  printf("   perimeter:   address: %lu, value: %lf\n", 
	 (unsigned long)&perimeter, perimeter);
  printf("   area:        address: %lu, value: %lf\n", 
	 (unsigned long)&area, area);

  return 0;

}
