Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 Pointers ( מצביעים ). 2 Variables in memory Primitives Arrays.

Similar presentations


Presentation on theme: "1 Pointers ( מצביעים ). 2 Variables in memory Primitives Arrays."— Presentation transcript:

1 1 Pointers ( מצביעים )

2 2 Variables in memory Primitives Arrays

3 3 Pointers Pointer is a variable that contains the address of a variable Here P is said to point to the variable C C 7 34…… 173172174175176177178179180181 174 34…… P 833832834835836837838839840841

4 4 Brief Summary of today’s session… &x – address (pointer) of variable x *x – content in address x (common) usage: int x = *y; (common) usage: printf(“%d”,*y); int */double */char * - define pointer to the corresponding primitive (common) usage: int * x = &y; int ** ?

5 5 Referencing The unary operator & gives the address of a variable The statement P=&C assigns the address of C to the variable P, and now P points to C To print a pointer, use %p format.

6 6 Referencing int C; int *P; /* Declare P as a pointer to int */ C = 7; P = &C; C 7 34…… 173172174175176177178179180181 174 34…… P 833832834835836837838839840841

7 7 Dereferencing The unary operator * is the dereferencing operator Applied on pointers Access the object the pointer points to The statement *P=5; Puts in C (the variable pointed by P) the value 5

8 8 Dereferencing printf(“%d”, *P); /* Prints out ‘7’ */ *P = 177; printf(“%d”, C); /* Prints out ‘177’ */ P = 177; /* This is unadvisable! */ C 7 34…… 173172174175176177178179180181 174 34…… P 833832834835836837838839840841 177

9 9 Example pointers.c

10 10 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 12 364 567 Z[0]Z[1]Z[2] 120248 364368372 … 564772

11 11 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 12 364 567 Z[0]Z[1]Z[2] 120248 364368372 120 564772

12 12 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 12 364 567 Z[0]Z[1]Z[2] 120248 364368372 120 564772

13 13 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 11 364 567 Z[0]Z[1]Z[2] 120248 364368372 120 564772

14 14 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 11 364 567 Z[0]Z[1]Z[2] 120248 364368372 120 564772

15 15 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 01 364 567 Z[0]Z[1]Z[2] 120248 364368372 120 564772

16 16 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 01 364 567 Z[0]Z[1]Z[2] 120248 364368372 120 564772

17 17 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 01 364 567 Z[0]Z[1]Z[2] 120248 364368372 564772

18 18 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 01 364 567 Z[0]Z[1]Z[2] 120248 364368372 564772

19 19 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 01 364 561 Z[0]Z[1]Z[2] 120248 364368372 564772

20 20 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 01 364 561 Z[0]Z[1]Z[2] 120248 364368372 564772

21 21 pointers.c – step by step int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); xy zip 01 364 561 Z[0]Z[1]Z[2] 120248 364368372 564772

22 22 Common errors It is impossible to define pointers to constants or expressions. It is also impossible to change a variable’s address (because it is not for us to determine!). Therefore, the following are errors: i = &3; j = &(k+5); k = &(a==b); &a = &b; &a = 150;

23 23 Pass arguments by value The functions we saw till now accepted their arguments “by value” They could manipulate the passed values They couldn’t change values in the calling function

24 24 Wrong swap (val_swap.c) void swap(int x, int y) { int temp; temp=x; x=y; y=temp; } int main(void) { int x=1,y=2; printf("before swap: x=%d, y=%d\n",x,y); swap(x,y); printf("after swap: x=%d, y=%d\n",x,y); }

25 25 How can we fix it? We can define swap so it gets pointers to integers instead of integers void swap(int *x, int *y) { …swap *x and *y… } We then call swap by swap(&x,&y); This is passing values by address

26 26 Right Swap (add_swap.c) void swap(int *x, int *y) { int temp; temp=*x; *x=*y; *y=temp; } int main(void) { int x=1,y=2; printf("before swap: x=%d, y=%d\n",x,y); swap(&x,&y); printf("after swap: x=%d, y=%d\n",x,y); }

27 27 Insights We can now understand the & in scanf(“%d”,&a); The argument list in scanf is simply passed by address, so scanf can change its content Other relevant examples from the past? Can we now “return” more then a single value from a function? How?

28 28 Exercise Write a function that accepts a double parameter and returns its integer and fraction parts. Write a program that accepts a number from the user and prints out its integer and fraction parts, using this function

29 29 Solution dbl_split.c

30 30 Exercise @ home The relation between rectangular and polar coordinates is given by – r = sqrt(x 2 +y 2 ) θ = tan -1 (y/x) Implement a function that accepts two rectangular coordinates and returns the corresponding polar coordinates Use the function atan defined in math.h

31 31 Solution rec_to_polar.c

32 32 Exercise Implement a function that accepts an integer array, and finds the two numbers that are closest together For example, if the array is – {1, 5, 7, 10, 6, 19} The function should find 5 and 6 (or 6 and 7, it doesn’t matter)

33 33 Solution array.c

34 34 Pointers and Arrays Recall that an array S holds the address of its first element S[0] S is actually a pointer to S[0] int S[10]; int *P; P=S; /* From now P is equivalent to S */ Both P and S are now pointing to S[0]

35 35 Pointer-array equivalence Arrays are actually a kind of pointers! When an array is defined, a fixed amount of memory the size of the array is allocated. The array variable is set to point to the beginning of that memory segment When a pointer is declared, it is uninitialized (like a regular variable) Unlike pointers, the value of an array variable cannot be changed


Download ppt "1 Pointers ( מצביעים ). 2 Variables in memory Primitives Arrays."

Similar presentations


Ads by Google