G08 Answer


#include <stdio.h>

struct Bulb
{
  int watts;
  int lumens;
};


/* function to print a Bulb array */
void printArray( struct Bulb b[], int size )
{
  int j;
  for ( j=0; j<size; j++ )
    printf("bulb %2d watts = %d\tlumens = %d\n", j, b[j].watts, b[j].lumens );
}

/* function to decrease light output */
void dimBulb( struct Bulb* b )
{
  /* decrease output by 10 percent */
  b->lumens = (b->lumens*90)/100;
}

int main(int argc, char *argv[])
{
  int j;
  
  /* declare and initialize a Bulb array */
  #define length 5
  struct Bulb lights[length] = { {100,1710}, {60,1065}, {100,1530}, {40,505}, {75,830} };

  /* print the Bulbs */
  printArray(lights, length);
  printf("\n");

  /* decrease light output of each Bulb */
  for ( j=0; j<length; j++ )
    dimBulb( &lights[j] );
    
  /* print the Bulbs */
  printArray(lights, length);
    
  system("pause");	
  return 0;
} 

Comments:

Notice how dimBulb(&lights[j]) designates the address of an array element. Another way to do the same thing is:

dimBulb( lights+j );

Recall that the expression

array[j]

is equivalent to the expression

*(array + j )

The name of an array stands for the address of the cell at index 0. The expression (array + j ) means "add the size of j cells to the address array. The address of each cell of the array is what we need to pass to the function.