Upload
meir
View
88
Download
2
Tags:
Embed Size (px)
DESCRIPTION
Functions and Pointers. Lecture 29. Summary of Previous Lecture. Algorithms Functions Using functions in top-down design Functions in C Language User defined Functions Parameters Return values. Topics. Functions Prototypes Variable Scope Pointers Introduction to pointers - PowerPoint PPT Presentation
Citation preview
Functions and Pointers
Lecture 29
Summary of Previous Lecture Algorithms
FunctionsUsing functions in top-down design
Functions in C LanguageUser defined FunctionsParametersReturn values
Topics
FunctionsPrototypesVariable Scope
Pointers Introduction to pointers Pointers and function parameters
Summary
Prototyping of Functions
Must declare functions before use (like variables)
Declaration is called a “prototype” Specifies the name, parameters and return
type of the function, but not the code
#include <stdio.h>
int isNegative (int);
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
Example: isNegative.c
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
#include <stdio.h>
int isNegative (int);
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
Example: isNegative.cFunction Prototype
#include <stdio.h>
int isNegative (int);
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
Function Definition
Example: isNegative.c
#include <stdio.h>
int isNegative (int);
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
Function Call (Must be after prototype, but can be before definition)
Example: isNegative.c
#include <stdio.h>
int isNegative (int);
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
Header files (filename.h) contain function prototypes and global
variable declarations
Example: isNegative.c
#include <stdio.h>
int isNegative (int);
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
stdio.h contains function prototypes for printf(), scanf(), and
other I/O functions
Example: isNegative.c
Header files You can make your own header files with
prototypes of frequently used functions:#include "myFunctions.h"
Put the functions in a corresponding C file, and include those too:#include "myFunctions.c"
#include <stdio.h>#include "myFunctions.h"#include "myFunctions.c"
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
Example: isNegative.c
Note:• " " around file name for user-defined files• < > for standard system files
isNegative() is declared in myFunctions.h and defined in myFunctions.c, not in this file!
Example: myFunctions.c
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
Example: myFunctions.h
int isNegative ( int );
Scope
Where can you use a variable which is declared in a function?
In that function only Not in a calling function Not in a called function
Scope: Local Variables Formal parameters: only accessible whilst
function executing Variables declared in a function body: only
accessible whilst function executing In fact, this is true of every block in a
program
#include <stdio.h>
int isNegative ( int n ){
int result;if (number<0){
result=1;}else {
result = 0;}return result;
}
Example: isNegative.c
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
#include <stdio.h>
int isNegative ( int n ){
int result;if (number<0){
result=1;}else {
result = 0;}return result;
}
Example: isNegative.c
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
ERROR! Number is local to the main function, not accessible
here
#include <stdio.h>
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
Example: isNegative.c
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
Use the parameter n which is local to the function isNegative()
#include <stdio.h>
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
Example: isNegative.c
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
number is the actual parameter
n is the formal parameter
#include <stdio.h>
int isNegative ( int n ){
int result;if ( n<0 ){
result=1;}else {
result = 0;}return result;
}
Example: isNegative.c
int main (void){
int number;
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative(number)){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
result & n: local to isNegative()number: local to main()
#include <stdio.h>
int number;
int isNegative ( void ){
int result;if ( number <0 ){
result=1;}else {
result = 0;}return result;
}
Example: isNegativeGlobal.c
int main (void){
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative()){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
#include <stdio.h>
int number;
int isNegative ( void ){
int result;if ( number <0 ){
result=1;}else {
result = 0;}return result;
}
Example: isNegativeGlobal.c
int main (void){
printf ("Enter an integer: ");scanf ("%d",&number);
if (isNegative()){
printf("Negative\n");}else{
printf("Positive\n");}
return 0;}
number is now GLOBAL - declared outside any function,
accessible in all functions (after the declaration)
Scope: Global Variables Global variables are accessible in any
function after their declaration to the end of that source file
They're useful, but risky if any and every function can modify them, it
can be difficult to keep track of their value Better to use local variables and
parameter passing if possible
Scope: Functions Functions are also accessible in any
function after their declaration to the end of that source file
Functions Summary Include function prototype before its use Be careful about the scope of variables
Pointers
Pointers Topics
Introduction to pointers Pointers and function parameters
What is a Pointer in C? As the name suggests, Pointer is to point
towards anything.For example pointer on the road, city etc.
Pointing towards “Road”
Pointers in C C pointers are used to point towards the
contents of any memory location.
char ch = ’A’;
’A’0x2000
ch:
Memory Address of a Variable
The value of the variable ch
The memory address of the
variable ch
The & Operator
• Gives the memory address of an object
• Also known as the “address operator”
&ch yields the value 0x2000
char ch = ’A’;
’A’0x2000
“conversion specifier” for printing a memory address
char ch;
printf(“%p”, &ch);
Example:
Pointers
ch
0x1FFF 0x2000 0x2001 0x20020x1FFEetc
‘B’
0x2000
chPtr
0x3A15
A variable which can store the memory address of another variable
Pointers
A pointer is a variable Contains a memory address Points to a specific data type Pointer variables are usually named varPtr
cPtr:
char* cPtr;Example:
• We say cPtr is a pointer to char
0x2004
Can store an address of variables of type char
Pointers and the & Operator
Example:
A
c:
0x2000
char c = ’A’;
char *cPtr;
cPtr:
0x2004
cPtr = &c;
0x2000
Assigns the address of c to cPtr
Notes on Pointers
int* numPtr;float* xPtr;
Example:
• We can have pointers to any data type
int *numPtr;float * xPtr;
Example:
• The * can be anywhere between the type and the variable
Notes on Pointers ..
• You can print the address stored in a pointer using the %p conversion specifier
printf(“%p”, numPtr);Example:
• You can assign the address of a variable to a “compatible” pointer using the & operator
int aNumber;int *numPtr;
numPtr = &aNumber;
Example:
The * Operator
• Allows pointers to access variables they point to
• Also known as “dereferencing operator”
• Should not be confused with the * in the pointer declaration
A
c:
0x2000
B
Pointers and the Operator
Example: char c = ’A’;
char *cPtr = NULL;
cPtr = &c;
*cPtr = ’B’;
Changes the value of the variable which cPtr
points to
cPtr:
0x2004
NULL0x2000
Easy Steps to Pointers Step 1: Declare the variable to be pointed to
int num;char ch = ‘A’;float x;
num:
‘A’ch:
x:
Easy Steps to Pointers … Step 2: Declare the pointer variable
int* numPtr = NULL;char *chPtr = NULL;float * xPtr = NULL;
int num;char ch = ‘A’;float x;
numPtr:
chPtr:
xPtr:
num:
‘A’ch:
x:
NULL
NULL
NULL
Easy Steps to Pointers .. Step 3: Assign address of variable to pointer
int* numPtr = NULL;char *chPtr = NULL;float * xPtr = NULL;
int num;char ch = ‘A’;float x;
numPtr = #
numPtr: addr of num
addr of chchPtr:
addr of xxPtr:
num:
‘A’ch:
x:A pointer’s type has to correspond to the type of the variable it points to
chPtr = &ch;xPtr = &x;
Easy Steps to Pointers .. Step 4: De-reference the pointers
int* numPtr = NULL;char *chPtr = NULL;float * xPtr = NULL;
int num;char ch = ‘A’;float x;
numPtr = #chPtr = &ch;xPtr = &x;
*xPtr = 0.25;*numPtr = *chPtr;
num: 65
‘A’ch:
0.25x:
numPtr: addr of num
addr of chchPtr:
addr of xxPtr:
Notes on Pointers ..
int *numPtr;Beware of pointers
which are not initialized!
???
numPtr
Notes on Pointers ..
int *numPtr = NULL;
NULL
numPtr
• When declaring a pointer, it is a good idea to always initialize it to NULL (a special pointer constant)
Pointers and Function Parameters
Example: Function to swap the values of two variables
x: 1
y: 2swap
x: 2
y: 1
#include <stdio.h>
void swap1(int a, int b){ int tmp;
tmp = a; a = b; b = tmp; return;}
int main(){ int x = 1, y = 2;
swap1(x, y); printf(“%d %d\n”, x, y); return 0;}
Bad swap
#include <stdio.h>
void swap1(int a, int b){ int tmp;
tmp = a; a = b; b = tmp; return;}
int main(){ int x = 1, y = 2;
swap1(x, y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
Bad swap
#include <stdio.h>
void swap1(int a, int b){ int tmp;
tmp = a; a = b; b = tmp; return;}
int main(){ int x = 1, y = 2;
swap1(x, y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
1
2
a:
b:
tmp:
Bad swap
#include <stdio.h>
void swap1(int a, int b){ int tmp;
tmp = a; a = b; b = tmp; return;}
int main(){ int x = 1, y = 2;
swap1(x, y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
1
2
a:
b:
1tmp:
Bad swap
#include <stdio.h>
void swap1(int a, int b){ int tmp;
tmp = a; a = b; b = tmp; return;}
int main(){ int x = 1, y = 2;
swap1(x, y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
2
2
a:
b:
1tmp:
Bad swap
#include <stdio.h>
void swap1(int a, int b){ int tmp;
tmp = a; a = b; b = tmp; return;}
int main(){ int x = 1, y = 2;
swap1(x, y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
2
1
a:
b:
1tmp:
Bad swap
#include <stdio.h>
void swap1(int a, int b){ int tmp;
tmp = a; a = b; b = tmp; return;}
int main(){ int x = 1, y = 2;
swap1(x, y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
2
1
a:
b:
1tmp:
Bad swap
#include <stdio.h>
void swap2(int* a, int* b){ int tmp;
tmp = *a; *a = *b; *b = tmp; return;}
int main(){ int x = 1, y = 2;
swap2(&x, &y); printf(“%d %d\n”, x, y); return 0;}
Good swap
#include <stdio.h>
void swap2(int* a, int* b){ int tmp;
tmp = *a; *a = *b; *b = tmp; return;}
int main(){ int x = 1, y = 2;
swap2(&x, &y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
Good swap
#include <stdio.h>
void swap2(int* a, int* b){ int tmp;
tmp = *a; *a = *b; *b = tmp; return;}
int main(){ int x = 1, y = 2;
swap2(&x, &y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
addr of x
addr of y
a:
b:
tmp:
Good swap
#include <stdio.h>
void swap2(int* a, int* b){ int tmp;
tmp = *a; *a = *b; *b = tmp; return;}
int main(){ int x = 1, y = 2;
swap2(&x, &y); printf(“%d %d\n”, x, y); return 0;}
1
2
x:
y:
addr of x
addr of y
a:
b:
1tmp:
Good swap
#include <stdio.h>
void swap2(int* a, int* b){ int tmp;
tmp = *a; *a = *b; *b = tmp; return;}
int main(){ int x = 1, y = 2;
swap2(&x, &y); printf(“%d %d\n”, x, y); return 0;}
2
2
x:
y:
addr of x
addr of y
a:
b:
1tmp:
Good swap
#include <stdio.h>
void swap2(int* a, int* b){ int tmp;
tmp = *a; *a = *b; *b = tmp; return;}
int main(){ int x = 1, y = 2;
swap2(&x, &y); printf(“%d %d\n”, x, y); return 0;}
2
1
x:
y:
addr of x
addr of y
a:
b:
1tmp:
Good swap
#include <stdio.h>
void swap2(int* a, int* b){ int tmp;
tmp = *a; *a = *b; *b = tmp; return;}
int main(){ int x = 1, y = 2;
swap2(&x, &y); printf(“%d %d\n”, x, y); return 0;}
2
1
x:
y:
Good swap
Pointers and Function Arguments
Change the value of an actual parameter variable
scanf exposed!
char ch;
int numx;
float numy;
scanf(“%c %d %f”, &ch, &numx, &numy);
Summary of Pointers Pointers point towards the content of
another memory location.Address of the other memory location is
stored in the pointer variable towards which it is pointing.
Pointers needed to be declared before used.
Never left any pointer un-initialized.