APS105 Functions (and Pointers) 1
Jan 25, 2016
1
APS105
Functions (and Pointers)
2
Modularity
• Modularity– Break a program into manageable parts (modules)– Modules interoperate with each other
• Benefits of modularity:
modularity/modules in C: functions
3
Functions
4
C pre-defined functions
• main• Math functions
– Sqrt(), fabs(), etc
• I/O functions– printf() , scanf()
5
Two Types of Functions
• Commands– perform a process, but don’t return anything
• Queries– evaluate something, return a result
• Some languages:– commands: called procedures, subroutines– queries: called functions
• C language:– commands: called functions– queries: called functions
6
Defining a Function
• Define a function that prints a blank line.
• Note: this is called a "function definition"
7
Incorporating a Function in a Program
.
8
Function Prototype
• Sometimes must summarize a function– tell the compiler what it needs to know– eg., if function has parameters or return value
• Function Prototype:– similar to a copy of the first line of the function
definition– Example of a prototype:
.
Prototype Example: Declare main First
.
10
Parameters
11
Functions with Parameters
• Define a function that prints n blank lines.
• Note: n is called a "parameter"
12
Calling a Function with Parameters
.
13
When A Function is Called…
1) argument(s) is/are evaluated
2) control passes to the function
3) parameter(s) is/are assigned value(s) • the values of the argument(s) are copied• i.e., param gets a copy of the value of the arg• this method is called "call-by-value"
• the only method used by C• other languages provide other methods
4) the function is executed
5) control passes back to the calling function
14
Example of A Query Function
• a function that returns the factorial of an int.
15
Function Scope of Identifiers/Variables
• An identifier/variable exists within its scope– if declared within a function
• the scope is within the function
• Implications: for a var declared within a func– can't be accessed outside that function– can re-use the identifier in multiple functions
16
Example of Scope
.
17
Example of Multiple Parameters
.
18
Parameter Type Correspondence
• Param and argument types needn't match– as long as they are "assignment compatible"
• Example:.
19
Returning
20
Multiple Returns
• A function can have multiple return statements• Example: a function that returns max value
.
21
Avoiding Multiple Returns
• Example: a function that returns max value.
22
No Return
• Example: print n blank lines.
23
Style: Returning Bool
• Functions that return bool should be named:is<something>
• Produces more readable code• Example:
.
24
isPerfectSquare
.
25
isPerfectSquare (cont'd)
.
26
isPerfectSquare (cont'd)
.
27
Pointers
28
Swap
• Example: a function to swap two values.
29
Pointers
• Need a way to refer to locations of things– not just a copy of a variable’s value
• a pointer:– points to a variable– eg., like a house address points to a house
• Example:
30
Memory• RAM
– random access memory– composed of memory chips– organized like a giant table of locations
• Addresses– every location in table has an address– just like every house on a street– use the address to read/write a location
• In C– addresses are stored in pointer variables– a pointer is a memory address
Address Value
0 0
1 23
2 0
3 0
… …
232-2 102
232-1 7
Memory
31
Understanding Pointers
• Declaring a pointer variableint *p;
• Declaring and assigningint *p; int x; x = 8; p = &x;
Addr Value
0 0
1 23
2 0
3 0
… …
232-2 102
232-1 7
Memory
.
32
Using Pointers
• Declaring, assigning, and using a pointerint *p;
int x; x = 8; p = &x; printf("%d\n",*p); // print what's at p
.
33
Pointers Example
double x, y;double *p, *q;x = 3.6;y = 6.7;p = &x;q = &y;*p = 1.0;*q = *p + 1.0;
Addr Value
0 0
1 0
2 0
3 0
4 0
5 0
… …
232-2 0
232-1 0
Memory
34
Pointers Example Again
double x, y;double *p, *q;x = 3.6;y = 6.7;p = &x;q = &y;*p = 1.0;*q = *p + 1.0;
x
y
p
q
35
Fixed Swap
• Example: a function to swap two values
.
36
Functions that Return Pointers
• Create a function called largeLoc– Takes addresses of two doubles– Returns the address of the larger value
• Example usage:double x = 2.6;double y = 3.4;double *p;p = largeLoc(&x,&y);.
37
largeLoc
.
38
Scope
39
Scope of Internal Identifiers
• Scope of an identifier:– the range within which it is recognized– an identifier is not recognized outside its scope
• i.e., it cannot be used, or compiler will complain
• Ex: for (int i = 1; ...; ...)– scope of i is within the for loop only
• Scope of a function parameter:– only within the body of the function
• Scope of a variable declared in a function– starts at the point of declaration– ends at the end of the block {} it was declared in– called an internal identifier
40
Scope Example
int foo(int x){ int y=5; for (int i=0;i<10;i++) { int z = 3; y *= z + x; } return y;}
41
Overlapping Scope
int i = 1;printf(“i = %d\n”,i);{ int i = 2; printf(“i = %d\n”,i);}printf(“i = %d\n”,i);
• What is the output?
42
Scope of External Identifiers
• External identifier– one that is declared outside of any function– ex: a function identifier/name is external
• Example:int x; // x is an external identifier
void main()
{
...
}
• If external ident. declared before all func.s:– then it is called global
43
Top-Down Modular Design
• Functions and scope provide modularity– can build them independently and combine
• Modularity eases large programs– break the problem into smaller & smaller parts– until the parts are small and manageable– make these into functions– combine them into the whole
44
Ex: Goldbach’s Conjecture
• Can an even number larger than 2 be expressed as the sum of two primes?.