Presentation is loading. Please wait.

Presentation is loading. Please wait.

ספטמבר 04Copyright Meir Kalech1 C programming Language Chapter 5: Pointers.

Similar presentations


Presentation on theme: "ספטמבר 04Copyright Meir Kalech1 C programming Language Chapter 5: Pointers."— Presentation transcript:

1 ספטמבר 04Copyright Meir Kalech1 C programming Language Chapter 5: Pointers

2 ספטמבר 04Copyright Meir Kalech2 What is a Pointer? A pointer is a variable that contains the address of a variable. A Pointer (to type) can be associated with a type. We are familiar with: int, float, char, … types. Each type has a comparable pointer (to) type: int *, float *, char *, etc. The difference: while primitive types store values, the pointer types store addresses. For example: int * stores an address of int. char * stores an address of char. float * stores an address of float. Pointer size is 4 bytes (independently of its type).

3 ספטמבר 04Copyright Meir Kalech3 Operators * and & C defines two operators: & (address of) and * (indirection) for use with pointers: Indirection Operator * has 2 different meanings: Upon declaration – “ I am a pointer ”. After declaration – access the variable whose address is held by the pointer. Address Operator & provides the address of a variable.

4 ספטמבר 04Copyright Meir Kalech4 Pointers Example FEDCBA9876543210 float1: 76.45int1: 24 1F1E1D1C1B1A19181716151413121110 db1: 2.45633 2F2E2D2C2B2A29282726252423222120 pfloat: cchar1: ‘ a ’ pint: 4 3F3E3D3C3B3A39383736353433323130 pchar: 29pdb: 12 4F4E4D4C4B4A49484746454443424140 void main() { int int1=24; float float1=76.45; double db1=2.45633; char char1=‘a’; double *pdb=&db1; char *pchar=&char1; int *pint; float *pfloat; pint = &int1; pfloat = &float1; }

5 ספטמבר 04Copyright Meir Kalech5 Example void main() { int x=4, y=8, temp; int *pint1,*pint2; pint1 = &x; pint2 = &y; temp = *pint1; *pint1 = *pint2; *pint2 = temp; } Swap two integer values through use of pointers

6 ספטמבר 04Copyright Meir Kalech6 Example void main() { int x=4, y=8, temp; int *pint1,*pint2; pint1 = &x; pint2 = &y; temp = *pint1; *pint1 = *pint2; *pint2 = temp; } temp: 100 8 y: 300 4 x: 200 pint2: 350pint1: 250

7 ספטמבר 04Copyright Meir Kalech7 Example void main() { int x=4, y=8, temp; int *pint1,*pint2; pint1 = &x; pint2 = &y; temp = *pint1; *pint1 = *pint2; *pint2 = temp; } temp: 100 8 y: 300 4 x: 200 300 pint2: 350 200 pint1: 250

8 ספטמבר 04Copyright Meir Kalech8 Example void main() { int x=4, y=8, temp; int *pint1,*pint2; pint1 = &x; pint2 = &y; temp = *pint1; *pint1 = *pint2; *pint2 = temp; } 4 temp: 100 8 y: 300 4 x: 200 300 pint2: 350 200 pint1: 250 *pint1

9 ספטמבר 04Copyright Meir Kalech9 Example void main() { int x=4, y=8, temp; int *pint1,*pint2; pint1 = &x; pint2 = &y; temp = *pint1; *pint1 = *pint2; *pint2 = temp; } 4 temp: 100 8 y: 300 8 x: 200 300 pint2: 350 200 pint1: 250 *pint1 *pint2

10 ספטמבר 04Copyright Meir Kalech10 Example void main() { int x=4, y=8, temp; int *pint1,*pint2; pint1 = &x; pint2 = &y; temp = *pint1; *pint1 = *pint2; *pint2 = temp; } 4 temp: 100 4 y: 300 8 x: 200 300 pint2: 350 200 pint1: 250 *pint2

11 ספטמבר 04Copyright Meir Kalech11 Example void main() { int x=4, y=8, temp; int *pint1,*pint2; pint1 = &x; pint2 = &y; temp = *pint1; pint1 = pint2; *pint2 = temp; } 4 temp: 100 4 y: 300 8 x: 200 300 pint2: 350 200 pint1: 250 What happens in this case?

12 ספטמבר 04Copyright Meir Kalech12 Example void main() { int x=4, y=8, temp; int *pint1,*pint2; pint1 = &x; pint2 = &y; temp = *pint1; pint1 = pint2; *pint2 = temp; } 4 temp: 100 4 y: 300 8 x: 200 300 pint2: 350 300 pint1: 250 This is a pointer assignment!

13 ספטמבר 04Copyright Meir Kalech13 Be careful int x = 4; int *px; px = x; Error compilation: Cannot convert from int to int * int x = 4; int *px; float *pf; pf = px; BUG! Cannot convert from int * to float * int *px; *px = 9; BUG!!! px points to garbage - trying to assign a value to memory not allocated

14 ספטמבר 04Copyright Meir Kalech14 Call by Address Passing argument by value: the argument is copied to the local parameter of the function. Passing argument by address: only the address of the argument is passed (a local parameter stores the address). So the operator * enables access to the value of the argument.

15 ספטמבר 04Copyright Meir Kalech15 Call by Value Example temp num2 num1 Return address y=5 x=3 void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); } void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_value main swap gets x and y and swaps between them void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } Address: 100 Address: 200 Address: 500 Address: 400 Address: 300

16 ספטמבר 04Copyright Meir Kalech16 Call by Value Example temp num2=5 num1=3 1024 y=5 x=3 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_value main Address: 100 Address: 200 Address: 500 Address: 400 Address: 300 Arguments passing void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); }

17 ספטמבר 04Copyright Meir Kalech17 Call by Value Example temp=3 num2=5 num1=3 1024 y=5 x=3 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_value main Address: 100 Address: 200 Address: 500 Address: 400 Address: 300 temp = num1; void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); }

18 ספטמבר 04Copyright Meir Kalech18 Call by Value Example temp=3 num2=5 num1=5 1024 y=5 x=3 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_value main Address: 100 Address: 200 Address: 500 Address: 400 Address: 300 num1 = num2; void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); }

19 ספטמבר 04Copyright Meir Kalech19 Call by Value Example temp=3 num2=3 num1=5 1024 y=5 X=3 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_value main Address: 100 Address: 200 Address: 500 Address: 400 Address: 300 num2 = temp; void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); }

20 ספטמבר 04Copyright Meir Kalech20 Call by Value Example y=5 x=3 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } main Address: 100 Address: 200 After swap_by_value has returned Note that x and y weren ’ t changed void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); }

21 ספטמבר 04Copyright Meir Kalech21 Call by Address Example temp num2 num1 Return address y=5 x=3 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_address main swap gets x and y and swaps between them Address: 100 Address: 200 Address: 600 void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); } Address: 500 Address: 300

22 ספטמבר 04Copyright Meir Kalech22 Call by Address Example temp num2=100 num1=200 1024 y=5 x=3 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_address main Address: 100 Address: 200 Address: 300 Arguments passing void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); } Address: 600 Address: 500

23 ספטמבר 04Copyright Meir Kalech23 Call by Address Example temp=3 num2=100 num1=200 1024 y=5 x=3 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_address main Address: 100 Address: 200 Address: 300 temp = *num1; void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); } Address: 600 Address: 500

24 ספטמבר 04Copyright Meir Kalech24 Call by Address Example temp=3 num2=100 num1=200 1024 y=5 x=5 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_address main Address: 100 Address: 200 Address: 300 *num1 = *num2; void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); } Address: 600 Address: 500

25 ספטמבר 04Copyright Meir Kalech25 Call by Address Example temp=3 num2=100 num1=200 1024 y=3 x=5 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } swap_by_address main Address: 100 Address: 200 Address: 300 *num2 = temp; void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); } Address: 600 Address: 500

26 ספטמבר 04Copyright Meir Kalech26 Call by Address Example y=3 x=5 void swap_by_value(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; } main Address: 100 Address: 200 After swap_by_value has returned Note that x and y were changed void swap_by_address(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } void main() { int x=3, y=5; swap_by_value(x, y); swap_by_address(&x, &y); }

27 ספטמבר 04Copyright Meir Kalech27 Passing Arguments - Summary Table By valueBy address (of array) Declarationfunc(type name) func(type name[]) func(type *name) Scope In function Lifetime In function Address: lifetime only in function Array ’ s elements: original lifetime Argument changeable No Address: no Array ’ s elements: yes

28 ספטמבר 04Copyright Meir Kalech28 Pointers and Arrays The meaning of assigning an array to a pointer is assigning the first array address (by array name) into the pointer: int array[5]; int *parr; parr = array; // same as parr = &array[0]; Scanning the array is possible by using: Operator [] Operator * But first, which pointer operators available?

29 ספטמבר 04Copyright Meir Kalech29 Pointer Arithmetic Operators There are some arithmetic operations that can be performed on pointers. Add/subtract an integer to/from a pointer: int arr[10]; int *ptr1 = arr, *ptr2; ptr2 = ptr1 + 3; //ptr1+3*sizeof(int) ptr1: 100 ?????????? arr 136132128124120116112108104100 ptr2: 112 Conclusion: On adding an integer to a pointer, the new address is determined according to sizeof of the pointed type.

30 ספטמבר 04Copyright Meir Kalech30 Pointer Relational Operators Comparing pointers: Two pointers can be compared if they point to the same type. Any pointer may be compared to the NULL (zero) pointer. Examples: int *p1 = NULL, *p2 = NULL; if (p1 == p2) … if (p1 < p2) … if (p1 != NULL) … A good programmer verifies the validity of a pointer before using the indirection operator * on it.

31 ספטמבר 04Copyright Meir Kalech31 Operator [] and Operator * As seen before, we may declare: int a[100]; int *p = a; The following expressions (in each line) have the same meaning:  a,&a[0],p,&p[0] address of the 1st element  *a,a[0],*p,p[0] value of the 1st element  a+1,&a[1],p+1,&p[1] address of the 2nd element  *(a+1),a[1],*(p+1),p[1] value of the 2nd element  a+i,&a[i],p+i,&p[i] address of the i-th element  *(a+i),a[i],*(p+i),p[i] value of the i-th element

32 ספטמבר 04Copyright Meir Kalech32 Operator [] and Operator * So what is the difference between operator [] and operator * ??? Note: The array name isn ’ t a variable!!! int arr[100]; int *parr = arr; arr++; arr += 5; parr++; parr += 5; Error in compilation Perfectly legal

33 ספטמבר 04Copyright Meir Kalech33 Operator ++ Given the declarations: int k, *ptr = NULL; int Arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; ptr = Arr; What is the meaning of k = *ptr++; ? k = *ptr++ is equivalent to the following 2 statements: k = *ptr; ptr++; What is the meaning of : k = (*ptr)++; k = *(ptr++); k = *++ptr; k = ++*ptr; Try to avoid such unreadable code, even it works!

34 ספטמבר 04Copyright Meir Kalech34 Scanning Arrays using Pointers Scanning arrays using pointers is faster than scanning them using indices. Here are 2 functions that perform the same job. 1.Uses indices to sum the n first elements of array v: long scan_with_indices(int v[], int n) { int i = 0; // The operations long total = 0; while(i < n) // < { total += v[i]; // += *(v + i*sizeof(int)) ++i; // ++ } return total; }

35 ספטמבר 04Copyright Meir Kalech35 Scanning Arrays using Pointers 2.Uses pointers to sum n first elements of array v. long scan_with_pointers(int *v, int n) { long total = 0; // The operations int *save_end = v+n; while(v < save_end) // < { total += *v; // += *(indirection) ++v; // ++ } return total; } Conclusion: Each iteration of scanning with indices involves a multiplying action and an addition action that are not necessary when scanning with pointers - more efficient!

36 ספטמבר 04Copyright Meir Kalech36 Array of Pointers Array of pointers is an array whose elements are pointer types. Definition: int *arr[5];// array of 5 int pointers This is necessary for 2D-array handling by pointers. For instance: Assume array of strings is defined. Manipulations on the array is preferable by pointers than by array indexing itself. For example: reverse the order of the strings.

37 ספטמבר 04Copyright Meir Kalech37 Array of Pointers Example void main() { char names[3][5] = {“DANA”, ”RANI”,”SHIR”}; char *pnames[3], *temp; int i, j; for(i=0; i<3; i++) pnames[i] = names[i]; for(i=0,j=3-1; i<j; i++,j--) { temp = pnames[i]; pnames[i] = pnames[j]; pnames[j] = temp; } for(i=0; i<3; i++) printf(“%s\n”, pnames[i]); } \0ANAD INAR RIHS names: 100 ? ? ? pnames: 200 200 204 208 ? temp: 300

38 ספטמבר 04Copyright Meir Kalech38 Array of Pointers Example void main() { char names[3][5] = {“DANA”, ”RANI”,”SHIR”}; char *pnames[3], *temp; int i, j; for(i=0; i<3; i++) pnames[i] = names[i]; for(i=0,j=3-1; i<j; i++,j--) { temp = pnames[i]; pnames[i] = pnames[j]; pnames[j] = temp; } for(i=0; i<3; i++) printf(“%s\n”, pnames[i]); } \0ANAD INAR RIHS names: 100 100 105 110 pnames: 200 200 204 208 ? temp: 300

39 ספטמבר 04Copyright Meir Kalech39 Array of Pointers Example void main() { char names[3][5] = {“DANA”, ”RANI”,”SHIR”}; char *pnames[3], *temp; int i, j; for(i=0; i<3; i++) pnames[i] = names[i]; for(i=0,j=3-1; i<j; i++,j--) { temp = pnames[i]; pnames[i] = pnames[j]; pnames[j] = temp; } for(i=0; i<3; i++) printf(“%s\n”, pnames[i]); } \0ANAD INAR RIHS names: 100 100 105 110 pnames: 200 200 204 208 ? temp: 300 i j

40 ספטמבר 04Copyright Meir Kalech40 Array of Pointers Example void main() { char names[3][5] = {“DANA”, ”RANI”,”SHIR”}; char *pnames[3], *temp; int i, j; for(i=0; i<3; i++) pnames[i] = names[i]; for(i=0,j=3-1; i<j; i++,j--) { temp = pnames[i]; pnames[i] = pnames[j]; pnames[j] = temp; } for(i=0; i<3; i++) printf(“%s\n”, pnames[i]); } \0ANAD INAR RIHS names: 100 100 105 110 pnames: 200 200 204 208 100 temp: 300 i j

41 ספטמבר 04Copyright Meir Kalech41 Array of Pointers Example void main() { char names[3][5] = {“DANA”, ”RANI”,”SHIR”}; char *pnames[3], *temp; int i, j; for(i=0; i<3; i++) pnames[i] = names[i]; for(i=0,j=3-1; i<j; i++,j--) { temp = pnames[i]; pnames[i] = pnames[j]; pnames[j] = temp; } for(i=0; i<3; i++) printf(“%s\n”, pnames[i]); } \0ANAD INAR RIHS names: 100 110 105 110 pnames: 200 200 204 208 100 temp: 300 i j

42 ספטמבר 04Copyright Meir Kalech42 Array of Pointers Example void main() { char names[3][5] = {“DANA”, ”RANI”,”SHIR”}; char *pnames[3], *temp; int i, j; for(i=0; i<3; i++) pnames[i] = names[i]; for(i=0,j=3-1; i<j; i++,j--) { temp = pnames[i]; pnames[i] = pnames[j]; pnames[j] = temp; } for(i=0; i<3; i++) printf(“%s\n”, pnames[i]); } \0ANAD INAR RIHS names: 100 110 105 100 pnames: 200 200 204 208 100 temp: 300 i j

43 ספטמבר 04Copyright Meir Kalech43 Array of Pointers Example void main() { char names[3][5] = {“DANA”, ”RANI”,”SHIR”}; char *pnames[3], *temp; int i, j; for(i=0; i<3; i++) pnames[i] = names[i]; for(i=0,j=3-1; i<j; i++,j--) { temp = pnames[i]; pnames[i] = pnames[j]; pnames[j] = temp; } for(i=0; i<3; i++) printf(“%s\n”, pnames[i]); } \0ANAD INAR RIHS names: 100 110 105 100 pnames: 200 200 204 208 Output : SHIR RANI DANA


Download ppt "ספטמבר 04Copyright Meir Kalech1 C programming Language Chapter 5: Pointers."

Similar presentations


Ads by Google