Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

26
http://www.comp.nus.edu.sg/~cs 1010/ UNIT 14 Functions with Pointer Parameters

Transcript of Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

Page 1: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

http://www.comp.nus.edu.sg/~cs1010/

UNIT 14

Functions with Pointer Parameters

Page 2: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

Unit 14: Functions with Pointer Parameters

CS1010 (AY2015/6 Semester 1) Unit14 - 2© NUS

Objectives: How to use pointers to return more than one

value in a function

Reference: Chapter 5 Functions: Lessons 5.4 – 5.5

Page 3: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

Unit 14: Functions with Pointer Parameters

CS1010 (AY2015/6 Semester 1) Unit14 - 3© NUS

1. Introduction

2. Functions with Pointer Parameters2.1 Function To Swap Two Variables

2.2 Examples

3. Design Issues3.1 When Not to Use Pointer Parameters

3.2 Pointer Parameters vs Cohesion

4. Lab #3 Exercise #2: Subsequence

Page 4: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

1. Introduction (1/4)

CS1010 (AY2015/6 Semester 1) Unit14 - 4© NUS

In Unit #4, we learned that a function may return a value, or it may not return any value at all (void function)

Is it possible for a function to return 2 or more values? Does the following function f(n) return both 2n and 3n?

int f(int n) {return 2 * n;return 3 * n;

}

No, f(n) returns only 2n. Once a return statement is executed, the function

terminates immediately.

Page 5: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

1. Introduction (2/4)

CS1010 (AY2015/6 Semester 1) Unit14 - 5© NUS

Below is a program that swaps two variables:

#include <stdio.h>

int main(void) {int var1, var2, temp;

printf("Enter two integers: ");scanf("%d %d", &var1, &var2);

// Swap the valuestemp = var1;var1 = var2var2 = temp;

printf("var1 = %d; var2 = %d\n", var1, var2);return 0;

}Unit14_Swap_v1.c

Enter two integers: 72 9var1 = 9; var2 = 72

Page 6: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

1. Introduction (3/4)

CS1010 (AY2015/6 Semester 1) Unit14 - 6© NUS

This is a modularised version of the previous program:#include <stdio.h>

void swap(int, int);

int main(void) {int var1, var2;

printf("Enter two integers: ");scanf("%d %d", &var1, &var2);

swap(var1, var2);

printf("var1 = %d; var2 = %d\n", var1, var2);return 0;

}

void swap(int para1, int para2) {int temp;temp = para1; para1 = para2; para2 = temp;

}Unit14_Swap_v2.c

Enter two integers: 72 9var1 = 72; var2 = 9

Page 7: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

1. Introduction (4/4)

CS1010 (AY2015/6 Semester 1) Unit14 - 7© NUS

What happens in Unit14_Swap_v2.c? It’s all about pass-by-value and scope rule! (See Unit #4)

In main():72

var1

9

var2

In swap(): 72

para1

9

para2

9 72

No way for swap() to modify the values of variables that are outside its scope (i.e. var1 and var2), unless...

Page 8: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

2. Functions with Pointer Parameters

CS1010 (AY2015/6 Semester 1) Unit14 - 8© NUS

The only way for a function to modify the value of a variable outside its scope, is to find a way for the function to access that variable

Solution: Use pointers! (See Unit #8)

In main():72

var1

9

var2

In swap():ptr1 ptr2

Page 9: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

2.1 Function to Swap Two Variables

CS1010 (AY2015/6 Semester 1) Unit14 - 9© NUS

Here’s the solution#include <stdio.h>

void swap(int *, int *);

int main(void) {int var1, var2;

printf("Enter two integers: ");scanf("%d %d", &var1, &var2);

swap(&var1, &var2);

printf("var1 = %d; var2 = %d\n", var1, var2);return 0;

}

void swap(int *ptr1, int *ptr2) {int temp;temp = *ptr1; *ptr1 = *ptr2; *ptr2 = temp;

}Unit14_Swap_v3.c

In main(): 72var1 9var2

In swap(): ptr1 ptr2

9 72

Page 10: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

2.2 Examples (1/4)

CS1010 (AY2015/6 Semester 1) Unit14 - 10© NUS

#include <stdio.h>void f(int, int, int);

int main(void) { int a = 9, b = -2, c = 5; f(a, b, c); printf("a = %d, b = %d, c = %d\n", a, b, c); return 0;}

void f(int x, int y, int z) { x = 3 + y; y = 10 * x; z = x + y + z; printf("x = %d, y = %d, z = %d\n", x, y, z);}

Unit14_Example1.c

x = 1, y = 10, z = 16a = 9, b = -2, c = 5

a9

b-2

c5

x9

y-2

z5

1 10 16

Page 11: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

2.2 Examples (2/4)

CS1010 (AY2015/6 Semester 1) Unit14 - 11© NUS

#include <stdio.h>void f(int *, int *, int *);

int main(void) { int a = 9, b = -2, c = 5; f(&a, &b, &c); printf("a = %d, b = %d, c = %d\n", a, b, c); return 0;}

void f(int *x, int *y, int *z){ *x = 3 + *y; *y = 10 * *x; *z = *x + *y + *z; printf("*x = %d, *y = %d, *z = %d\n", *x, *y, *z);}

Unit14_Example2.c

*x = 1, *y = 10, *z = 16a = 1, b = 10, c = 16

a9

b-2

c5

x y z

1 10 16

*x is a, *y is b, and *z is c!

Page 12: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

2.2 Examples (3/4)

CS1010 (AY2015/6 Semester 1) Unit14 - 12© NUS

#include <stdio.h>void f(int *, int *, int *);

int main(void) { int a = 9, b = -2, c = 5; f(&a, &b, &c); printf("a = %d, b = %d, c = %d\n", a, b, c); return 0;}

void f(int *x, int *y, int *z){ *x = 3 + *y; *y = 10 * *x; *z = *x + *y + *z; printf("x = %d, y = %d, z = %d\n", x, y, z);}

Unit14_Example3.c

Compiler warnings, because x, y, z are NOT integer variables!They are addresses (or pointers).

Page 13: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

2.2 Examples (4/4)

CS1010 (AY2015/6 Semester 1) Unit14 - 13© NUS

#include <stdio.h>void f(int *, int *, int *);

int main(void) { int a = 9, b = -2, c = 5; f(&a, &b, &c); printf("a = %d, b = %d, c = %d\n", a, b, c); return 0;}

void f(int *x, int *y, int *z){ *x = 3 + *y; *y = 10 * *x; *z = *x + *y + *z; printf("x = %p, y = %p, z = %p\n", x, y, z);}

Unit14_Example4.c

Use %p for pointers.

x = ffbff78c, y = ffbff788, z = ffbff784a = 1, b = 10, c = 16

Addresses of variables a, b and c. (Values change from run to run.)

Page 14: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

3. Design Issues

CS1010 (AY2015/6 Semester 1) Unit14 - 14© NUS

We will discuss some design issues relating to the use of pointer parameters. When should pointer parameters be avoided Situations when the use of pointer parameters may

violate cohesion

Page 15: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

3.1 When Not to Use Pointer Parameters

CS1010 (AY2015/6 Semester 1) Unit14 - 15© NUS

Both programs are correct, but which is preferred? Why?

int main(void) {int num1 = 1, num2 = 2;print_values(num1, num2);return 0;

}

void print_values(int n1, int n2) {printf("Values: %d and %d", n1,

n2);}

(A)

(B)

int main(void) {int num1 = 1, num2 = 2;print_values(&num1, &num2);return 0;

}

void print_values(int *n1, int *n2) {printf("Values: %d and %d", *n1,

*n2);}

Unit14_Print_v1.c

Unit14_Print_v2.c

(B) does not allow calls like print_values(3, 4), print_values(a+b, c*d), etc., whereas (A) does.

Use pointer parameters only if absolutely necessary.

Page 16: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

3.2 Pointer Parameters vs Cohesion (1/6)

CS1010 (AY2015/6 Semester 1) Unit14 - 16© NUS

Task: find the maximum value and average of an array 2 versions are shown

Version 1: Unit14_Max_and_Average_v1.c uses 2 functions to separately compute the maximum and average.

Version 2: Unit14_Max_and_average_v2.c uses a single function, with pointer parameters, to return both maximum and average.

Page 17: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

3.2 Pointer Parameters vs Cohesion (2/6)

CS1010 (AY2015/6 Semester 1) Unit14 - 17© NUS

#include <stdio.h>

int findMaximum(int [], int);double findAverage(int [], int);

int main(void) {int numbers[10] = { 1, 5, 3, 6, 3, 2, 1, 9, 8, 3 };

int max = findMaximum(numbers, 10);double ave = findAverage(numbers, 10);

printf("max = %d, average = %.2f\n", max, ave);return 0;

}

Unit14_Max_and_Average_v1.c

Page 18: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

3.2 Pointer Parameters vs Cohesion (3/6)

CS1010 (AY2015/6 Semester 1) Unit14 - 18© NUS

// Compute maximum value in arr// Precond: size > 0int findMaximum(int arr[], int size) {

int i, max = arr[0];for (i=1; i<size; i++) {

if (arr[i] > max)max = arr[i];

}return max;

}

// Compute average value in arr// Precond: size > 0double findAverage(int arr[], int size) {

int i;double sum = 0.0;for (i=0; i<size; i++)

sum += arr[i];return sum/size;

}

Unit14_Max_and_Average_v1.c

Page 19: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

3.2 Pointer Parameters vs Cohesion (4/6)

CS1010 (AY2015/6 Semester 1) Unit14 - 19© NUS

#include <stdio.h>

void findMaxAndAverage(int [], int, int *, double *);

int main(void) {int numbers[10] = { 1, 5, 3, 6, 3, 2, 1, 9, 8, 3 };int max;double ave;

findMaxAndAverage(numbers, 10, &max, &ave);

printf("max = %d, average = %.2f\n", max, ave);return 0;

}

Unit14_Max_and_Average_v2.c

Page 20: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

3.2 Pointer Parameters vs Cohesion (5/6)

CS1010 (AY2015/6 Semester 1) Unit14 - 20© NUS

// Compute maximum value and average value in arr// Precond: size > 0void findMaxAndAverage(int arr[], int size, int *max_ptr, double *ave_ptr) {

int i;double sum = 0.0;

*max_ptr = arr[0];for (i=0; i<size; i++) {

if (arr[i] > *max_ptr) {*max_ptr = arr[i];

}sum += arr[i];

}

*ave_ptr = sum/size;}

Unit14_Max_and_Average_v2.c

Page 21: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

3.2 Pointer Parameters vs Cohesion (6/6)

CS1010 (AY2015/6 Semester 1) Unit14 - 21© NUS

Which version is better?Version 1 Version 2

Uses separate functions findMaximum() and findAverage()

Uses one function findMaxAndAverage()

No pointer parameter in functions

Uses pointer parameters in function

Functions are cohesive (refer to Week 3 Exercise 4: Cohesion) because each function does one task. Allows code reusability.

More efficient because overall one loop is used to compute the results, instead of two separate loops in version 1.

Trade-off between cohesion and efficiency. At this point, we shall value cohesion more.

Page 22: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

4 Lab #3 Exercise #2: Subsequence (1/3)

CS1010 (AY2015/6 Semester 1) Unit14 - 22© NUS

In this exercise, you are required to compute 3 values of the solution subsequence: Sum Interval Start position

As the topic on pointer parameters hasn’t been covered then, you are told to use a 3-element array ans to hold these 3 values.

This is only possible because the 3 values happen to be of the same type, i.e. int.

As arrays are actually pointers, the function sum_subsequence() is able to put the 3 answers into the array ans

Page 23: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

4 Lab #3 Exercise #2: Subsequence (2/3)

CS1010 (AY2015/6 Semester 1) Unit14 - 23© NUS

We modify the function to return the 3 values through 3 pointers.

#include <stdio.h>

int scan_list(int []);void sum_subsequence(int [], int, int []);

int main(void) {int list[10], size;int answers[3]; // stores the required answers

size = scan_list(list);sum_subsequence(list, size, answers);

printf("Max sum ...", answers[0], answers[1], answers[2]);

return 0;}

void sub_subsequence(int arr[], int size, int ans[]) {...

}

Old program

Page 24: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

4 Lab #3 Exercise #2: Subsequence (3/3)

CS1010 (AY2015/6 Semester 1) Unit14 - 24© NUS

We modify the function to return the 3 values through 3 pointers.

#include <stdio.h>

int scan_list(int []);void sum_subsequence(int [], int, int *, int *, int *);

int main(void) {int list[10], size;int sum, interval, start;

size = scan_list(list);sum_subsequence(list, size, &sum, &interval, &start);

printf("Max sum ...", sum, interval, start);return 0;

}

void sub_subsequence(int arr[], int size, int *sum_ptr, int *interval_ptr, int *start_ptr) {

...}

New program

Page 25: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

Summary

CS1010 (AY2015/6 Semester 1) Unit14 - 25© NUS

In this unit, you have learned about Using pointer parameters in functions, to allow a

function to modify the values of variables outside the function

Page 26: Http://cs1010/ UNIT 14 Functions with Pointer Parameters.

End of File

CS1010 (AY2015/6 Semester 1) Unit14 - 26© NUS