Presentation is loading. Please wait.

Presentation is loading. Please wait.

C programming Lecture 8 – pointers

Similar presentations


Presentation on theme: "C programming Lecture 8 – pointers"— Presentation transcript:

1 C programming Lecture 8 – pointers
Based on slides designed by Shay Artsi, Aythan Avior, Gitit Rockstein and Saher Ismir for the department of Computer Science, Technion, Israel Institute of Technology Translated and updated by Anne Weill-Zrahia נכתב על-ידי טל כהן, נערך ע"י איתן אביאור. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל

2 Motivation : swap places
We want to exchange the contents of variables x and y . We will do this buy defining a new variable temp int x, y, temp; temp = x; x = y; y = temp; 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

3 מבוא למחשב בשפת .C כל הזכויות שמורות ©
Let’s assume now that this operation is performed several times in the code and that we wish to define a function for it. void swap(int a, int b) { int temp = a; a = b; b = temp; } swap(x, y); This will not give the requested effect (why?) 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

4 Parameter passing to a function – by value
In C the value of the argument is passed to a function, this is called passing by value. When a variable is passed to the function, a copy of this variable is passed in fact Even if the function changes its copy , this will not affect the varialb in main program void swap(int a, int b) { int temp = a; a = b; b = temp; } int main() int x = 5, y = 7; swap(x,y); a b temp 7 ? 5 5 7 ? ? 5 What can we do ? x y 5 7 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

5 Example 2 : function for fraction addition
Motivation : write a function which receives 4 values x1, y1, x2, y2. and returns In fact it will return 2 values a & b so that Problem : the function returns a single value : 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

6 Addresses of variables in main memory
: Address of x { double x; int d; char c; ... } Address of d Address of c 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 x y c 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

7 Addresses, pointer, the operator &
&a is the address of a in main memory The operator & is applied to memory cells in main memory The operator * is the opposite of &. int * is a declaration of the address of a variable of type int Same for float,char etc. A variable declared as type * is called a pointer 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

8 מבוא למחשב בשפת .C כל הזכויות שמורות ©
Examples of pointer Memory 1004 1000 ? p int y; int a = 3; int *p; p = &a; 1000 3 a 996 ? y char c; char *cp1, *cp2 = &c; double *dp, *dq; double x; dp = dq = &x; 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

9 מבוא למחשב בשפת .C כל הזכויות שמורות ©
Pointers – cont. It s not permitted to mix kinds of pointers It is permitted to perform a casting (provided one knows what one is doing) Pointers to functions exist in C , but are not in the scope of this course. int *p; double a; p = &a; p = (int *)&a; 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

10 Pointers and operator *
The operator * is the opposite of & and denotes: *p denotes “contents of p” where p is a pointer Memory int y; int a = 3; int *p; p = &a; y = *p; *p = 7; 1004 ? 1000 p 1000 3 7 a 996 ? 3 y 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

11 Examples with pointers
int i = 3, j = 5, *p = &i, *q = &j, *r; double x; Expression Equivalence Value p == &i p == (& i) 1 * * & p * (* (& p))) 3 r = & x r = (& x) /* ? */ 7 * * p / * q + 7 ((7 * (*p))) / (*q)) + 7 11 * (r = & j) *= * p (* (r = (& j))) *= (* p) 15 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

12 Passing pointers to functions
void swap(int * a, int * b) { int temp = *a; *a = *b; *b = temp; } int main(void) int x = 5, y = 7; swap(&x, &y); ... Memory *נתעלם מכתובת חזרה וכו' על המחסנית 1040 5 ? temp 1036 ? 1004 b 1032 ? 1000 a 1004 5 7 y 1000 7 5 x 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

13 Pointers as parameters
void swap(int * a, int * b) { int temp = *a; *a = *b; *b = temp; } int main() int a, b, c = 1, d = 2; int *p = &b; scanf("%d %d", &a, p); ... swap(&a, &c); swap(p, &d); scanf will update a memory location (store there a value which is read from input) therefore it needs a parameter of type pointer Why not &? 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

14 Example :Function to simplify a fraction
Data: numerator and denominator Goal : Update both variable so that they represent the simplified fraction : void reduce(int * x, int * y); Parameters are used both for in and out. int a, b; ... reduce(&a, &b) 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

15 Example – simplification of fractions
int gcd(int, int); void reduce(int * p_numerator, int * p_denominator) { int  g = gcd(*p_numerator, *p_denominator); if    ( g > 1 ) { *p_numerator /= g; *p_denominator /= g; } 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

16 Example : addition of 2 fractions
Data : 4 values representing 2 fractions. Goal: compute a and b such that החתימה של הפונקציה: void add(int * a, int * b, int x1, int y1, int x2, int y2); x1, y1, x2, y2 are passed by value A,b are passed by reference and are exit parameters. \. int n, m, a1, b1; ... add(&n, &m, a1, b1, 5, 10) What will happen if the 2 first parameters are passed by value? 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

17 Implementation int gcd(int, int); void reduce(int *x, int *y);
int lcm(int, int); // Least Common Multiplier void add(int *pa, int *pb, int a1, int b1, int a2, int b2) { *pb = lcm(b1, b2); *pa = a1 * (*pb / b1) + a2 * (*pb / b2); reduce(pa, pb); } int lcm(int n, int m) return n / gcd(n,m) * m; Order of arithmetic operations to avoid overflow 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

18 Passing parameters methods
By value Simpler syntax Prevents unwanted change of the variable in calling function Entry parameter Single return value By address (or by reference) More efficient in cases where creation of actual parameter is space consuming Parameters are in, out or in-out Parameters can be changed in calling program This latter can be avoided by using const to declare the parameter const int * p 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

19 מבוא למחשב בשפת .C כל הזכויות שמורות ©
The NULL pointer 0 (zero) is a valid value for a pointer Therefore to describe a “zero” pointer there is a bit combination which does not represent any address The NULL pointer is defined in stdio.h as 0 Setting a pointer to NULL means that it is empty, or that is does not contain a valid address in memory int *p = NULL; *p = 7; /* what will happen? */ 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

20 מבוא למחשב בשפת .C כל הזכויות שמורות ©
Simple sort Goal : sort 2 numbers of type double. Method : write a function called swap_double which will exchange the 2 values if not in right order Algorithm: if (b < a) swap_double(&a, &b); Prototype of the function: sort2(double *x, double *y); 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

21 Sorting 2 numbers void swap_double(double* x, double* y) {
double temp = *x; *x = *y; *y = temp; } void sort2(double* a, double* b) if (b < a) { swap_double(a, b); There is a bug in sort2 – can you find it? Attention: this bug will not be discovered in compilation, nor runtime, just give wrong answers This is the worst type of bug – appears when making a demonstration to the boss …. 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

22 Sorting 2 numbers - correction
void swap_double(double* x, double* y) { double temp = *x; *x = *y; *y = temp; } void sort2(double* a, double* b) if (*b < *a) { swap_double(a, b); מדוע אין צורך לשנות את הקריאה ל-swap? 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©

23 Conclusion and question
How can we implement a function which sorts 4 numbers, using our sort2? Prototype: Calling sequence Goal (after calling the function): x ≤ y ≤ z ≤ w. sort4(double * a, double * b, double * c, double * d); sort4(&x, &y, &z, &w); 7 הרצאה מבוא למחשב בשפת .C כל הזכויות שמורות ©


Download ppt "C programming Lecture 8 – pointers"

Similar presentations


Ads by Google