12.010 Basic C: New Features
 
 

Pointers

( not in F77 )

  1. int a; refers to value held at location a.
  2. int *ptr_to_a; pointer to memory location where value is held.
  3. ptr_to_a=&a; sets pointer to equal location in memory used by variable a.

Examples

 

main() {

float a;           /* Floating point number              */

  float *ptr_to_a;   /* Pointer to a floating point number */

 

  a = 7.;            /* Write 7. to memory location associated with a   */

  printf("Value in a == %f\n",a);

 

  ptr_to_a = &a;     /* Get the address of the memory location where    */

                     /* assignments to a get written.                   */

  printf("Memory address of a (in hexadecimal) == %X\n",ptr_to_a);

 

  /* Now use pointer to read value stored at an address                 */

  printf("Value stored at address %X == %f\n",ptr_to_a,*ptr_to_a);

 

  /* Write a new value to an address in memory  */

  *ptr_to_a = 3.;

 

  /* What value does a have now? */

  printf("Value in a == %f\n",a);

 

  /* In C arrays and pointers are the same thing! */

  /* [0] is ptr_to_a + offset of 0*4 bytes        */

  /* [1] is ptr_to_a + offset of 1*4 bytes        */

  /* etc......                                    */

  printf("Value stored at address %X == %f\n",ptr_to_a,ptr_to_a[0]);

 

}

Call by value

C

#include <stdio.h>

 

void afunc(int, int);

main() {

 int i1, i2;

 i1 = 3; i2 = 4;

 printf("in main()");

 printf(" i1 == %d, i2 == %d\n",i1,i2);

 afunc( i1, i2 );

 printf("in main()");

 printf(" i1 == %d, i2 == %d\n",i1,i2);

}

 

void afunc(int a, int b) {

 printf("in afunc()");

 printf(" a == %d, b == %d\n",a,b);

 a = 7; b = 6;

 printf("in afunc()");

 printf(" a == %d, b == %d\n",a,b);

}

                        

F77

       PROGRAM MAIN

       INTEGER I1, I2

       I1 = 3

       I2 = 4

       WRITE(6,'(A,I4,I4)') 'in AFUNC() I1,I2: ',I1,I2

       CALL AFUNC(I1, I2)

       WRITE(6,'(A,I4,I4)') 'in AFUNC() I1,I2: ',I1,I2

       END

 

       SUBROUTINE AFUNC( A, B )

       INTEGER A, B

       WRITE(6,'(A,I4,I4)') 'in AFUNC() A,B: ',A,B

       A = 7

       B = 6

       WRITE(6,'(A,I4,I4)') 'in AFUNC() A,B: ',A,B

       END

Call by reference

C

#include <stdio.h>

 

void afunc(int *, int *);

main() {

 int i1, i2;

 i1 = 3; i2 = 4;

 printf("in main()");

 printf(" i1 == %d, i2 == %d\n",i1,i2);

 afunc( &i1, &i2 );

 printf("in main()");

 printf(" i1 == %d, i2 == %d\n",i1,i2);

}

 

void afunc(int *a, int *b) {

 printf("in afunc()");

 printf(" a == %d, b == %d\n",*a,*b);

 *a = 7; *b = 6;

 printf("in afunc()");

 printf(" a == %d, b == %d\n",*a,*b);

}

F77

       PROGRAM MAIN

       INTEGER I1, I2

       I1 = 3

       I2 = 4

       WRITE(6,'(A,I4,I4)') 'in AFUNC() I1,I2: ',I1,I2

       CALL AFUNC(I1, I2)

       WRITE(6,'(A,I4,I4)') 'in AFUNC() I1,I2: ',I1,I2

       END

 

       SUBROUTINE AFUNC( A, B )

       INTEGER A, B

       WRITE(6,'(A,I4,I4)') 'in AFUNC() A,B: ',A,B

       A = 7

       B = 6

       WRITE(6,'(A,I4,I4)') 'in AFUNC() A,B: ',A,B

       END

structures and defined types

C

#include <stdio.h>

 

typedef struct { float cx;

                 float cy;

                 float cz;

                 int   color; } t_point;

void point_print( t_point );

 

main() {

 t_point point;

 point.cx=3.; point.cy=3.; point.cz=2.; point.color=10;

 point_print(point);

}

 

void point_print(t_point point) {

 printf(" cx == %f, cy == %f\n",point.cx,point.cy);

 printf(" cz == %f, color == %d\n",point.cz,point.color);

}

F77

       PROGRAM MAIN

       REAL POINT_COORD(3)

       INTEGER POINT_COLOR

       POINT_COORD(1) = 3.

       POINT_COORD(2) = 3.

       POINT_COORD(3) = 2.

       POINT_COLOR    = 10

       CALL POINT_PRINT( POINT_COORD, POINT_COLOR )

       END

 

       SUBROUTINE POINT_PRINT( POINT_COORD, POINT_COLOR )

       REAL    POINT_COORD(3)

       INTEGER POINT_COLOR

       WRITE(6,'(A,3F12.4,I4)') 'COORD(1,2,3): ',

     &  POINT_COORD(1),

     &  POINT_COORD(2),

     &  POINT_COORD(3),

     &  POINT_COLOR

       END

malloc()

#include < stdio.h >

 

 typedef struct { float cx;

                  float cy;

                  float cz;

                  int   color; } t_point;

 void point_print( t_point );

 

 main() {

  int nel;

  t_point *points;

 

  nel=10;

 

  points = (t_point *) calloc(nel, sizeof(*points) ); 

 

  for(i=0;i < nel;++i) {

   point_print(points[i]);

  }

 }

 

 void point_print(t_point point) {

  printf(" cx == %f, cy == %f\n",point.cx,point.cy);

  printf(" cz == %f, color == %d\n",point.cz,point.color);

 }