View
222
Download
0
Embed Size (px)
Citation preview
1
Pointers Pointers ((מצביעיםמצביעים))
2
Variables in memory
Primitives Arrays
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 3 4… …
173172 174 175 176 177 178 179 180 181
174 3 4… …
P
833832 834 835 836 837 838 839 840 841
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
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
Referencing
int C;int *P; /* Declare P as a pointer to int
*/C = 7;P = &C;
C
7 3 4… …
173172 174 175 176 177 178 179 180 181
174 3 4… …
P
833832 834 835 836 837 838 839 840 841
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
Dereferencing
printf(“%d”, *P); /* Prints out ‘7’ */*P = 177;printf(“%d”, C); /* Prints out ‘177’ */P = 177; /* This is unadvisable! */
C
7 3 4… …
173172 174 175 176 177 178 179 180 181
174 3 4… …
P
833832 834 835 836 837 838 839 840 841
177
177
9
Example
pointers.c
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);
x y
z ip
1 2
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
…
564 772
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);
x y
z ip
1 2
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
120
564 772
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);
x y
z ip
1 2
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
120
564 772
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);
x y
z ip
1 1
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
120
564 772
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);
x y
z ip
1 1
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
120
564 772
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);
x y
z ip
0 1
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
120
564 772
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);
x y
z ip
0 1
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
120
564 772
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);
x y
z ip
0 1
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
372
564 772
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);
x y
z ip
0 1
364
5 6 7
Z[0] Z[1] Z[2]
120 248
364 368 372
372
564 772
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);
x y
z ip
0 1
364
5 6 1
Z[0] Z[1] Z[2]
120 248
364 368 372
372
564 772
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);
x y
z ip
0 1
364
5 6 1
Z[0] Z[1] Z[2]
120 248
364 368 372
372
564 772
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);
x y
z ip
0 1
364
5 6 1
Z[0] Z[1] Z[2]
120 248
364 368 372
372
564 772
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
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
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
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
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
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
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
Solution
dbl_split.c
30
Exercise @ home
The relation between rectangular and polar coordinates is given by –
r = sqrt(x2+y2)θ = 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
Solution
rec_to_polar.c
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
Solution
array.c
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
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