Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecture 9 - Pointers 1. Outline Introduction Pointer Variable Definitions and Initialization Pointer Operators Calling Functions by Reference Pointer.

Similar presentations


Presentation on theme: "Lecture 9 - Pointers 1. Outline Introduction Pointer Variable Definitions and Initialization Pointer Operators Calling Functions by Reference Pointer."— Presentation transcript:

1 Lecture 9 - Pointers 1

2 Outline Introduction Pointer Variable Definitions and Initialization Pointer Operators Calling Functions by Reference Pointer Expressions and Pointer Arithmetic Relationship between Pointers and Arrays Arrays of Pointers 2

3 Introduction Pointer is the address (i.e. a specific memory location) of an object. It can refer to different objects at different times. Pointers are used in C programs for a variety of purposes: To return more than one value from a function (using pass by reference) To create and process strings To manipulate the contents of arrays and structures To construct data structures whose size can grow or shrink dynamically 3

4 Pointer Variable Definitions and Initialization Pointer variables Contain memory addresses as their values Normal variables contain a specific value (direct reference) Pointer contains an address of a variable that has a specific value (indirect reference) Indirection – referencing a pointer value num 7 7 numPtr 4

5 Pointer Variable Definitions and Initialization Pointer definitions * is used with pointer variables int *numPtr; Defines a pointer to an int (pointer of type int *) Multiple pointers require using a * before each variable definition int *numPtr1, *numPtr2; Can define pointers to any data type Initialize pointers to 0, NULL, or an address 0 or NULL – points to nothing ( NULL preferred) int *numPtr = NULL; or int *numPtr = 0; 5

6 Pointer Operators Symbol & is called address operator Returns address of operand int num = 7; int *numPtr; numPtr = # /* numPtr gets address of num */ numPtr “points to” num numPtr num 7 numPtr 500000600000 num 6000007 Address of num is value of numPtr 6

7 Pointer Operators Symbol * is called indirection/dereferencing operator Returns a synonym/alias of what its operand points to *numPtr returns num (because numPtr points to num ) * can also be used for assignment Returns alias to an object *numPtr = 10; /* changes num to 10 */ show pictures!! Dereferenced pointer (operand of * ) must be an lvalue (no constants) * and & are inverses They cancel each other out 7

8 #include int main() { int num; int *numPtr; int num1=5; num = 7; printf("number = %d\n", num); numPtr = # printf("numPtr points to num whereby the value is = %d\n",*numPtr); printf("Address of numPtr : %d Contents of numPtr : %d\n", &numPtr, numPtr); printf("Address of num : %d\n\n", &num); *numPtr = 15; printf("Dereferencing pointer, *numPtr = %d\n", *numPtr); num = num + num1; printf(“num = %d\n”, num); printf("*numPtr = %d\n", *numPtr); printf("*numPtr + num1 = %d\n", *numPtr + num1); return 0; } Sample program number = 7 numPtr points to num whereby the value is = 7 Address of numPtr : 1245060 Contents of numPtr : 1245064 Address of num : 1245064 Dereferencing pointer, *numPtr = 15 num = 20 *numPtr = 20 *numPtr + num1 = 25 8

9 Calling Functions by Reference Call by reference with pointer arguments Passes address of argument using & operator Allows you to change actual location in memory Arrays are not passed with ‘ & ’ because the array name is already a pointer * operator Used as alias or nickname for variable inside of function void fun1 (int *number) { *number = 2 * (*number); } *number used as nickname for the variable passed 9

10 Remember..last time #include char read(); void find_count_vc(char, int*, int*); void print(int,int); int main() { char ch, choice; int count_v=0,count_c=0; do { ch = read(); find_count_vc(ch, &count_v, &count_c); printf("Do you want to continue?"); scanf("%c", &choice); getchar(); }while((choice == 'y') ||(choice =='Y')); print(count_v,count_c); return 0; } char read() { char ch1; printf("Enter character : "); scanf("%c", &ch1); getchar(); return(ch1); } void find_count_vc(char ch1, int *vowel, int *consonant) { switch(ch1) { case 'A': case 'a': case 'E': case 'e': case 'I': case 'i': case 'O': case 'o': case 'U': case 'u': *vowel = *vowel +1;break; default: *consonant = *consonant + 1; } void print(int vowel, int consonant) { printf("Number of vowel : %d\n", vowel); printf("Number of consonant : %d\n", consonant); } Enter character : f Do you want to continue?y Enter character : I Do you want to continue?y Enter character : k Do you want to continue?n Number of vowel : 1 Number of consonant : 2 Functions that “return” more than one value i.e. arguments are passed by ref 10

11 Pointer Expressions and Pointer Arithmetic Arithmetic operations can be performed on pointers Increment/decrement pointer ( ++ or -- ) Add an integer to a pointer ( + or +=, - or -= ) Pointers may be subtracted from each other Operations meaningless unless performed on an array 11

12 Pointer Expressions and Pointer Arithmetic 5 element int array on machine with 4 byte ints vPtr points to first element v[ 0 ] at location 3000 (vPtr = 3000) vPtr += 2; sets vPtr to 3008 vPtr points to v[ 2 ] (incremented by 2), but the machine has 4 byte ints, so it points to address 3008 pointer variable vPtr v[0]v[1]v[2]v[4]v[3] 3004300830123016 location 3000 12

13 Pointer Expressions and Pointer Arithmetic Subtracting pointers Returns number of elements from one to the other. If vPtr2 = &v[ 2 ]; vPtr = &v[ 0 ]; vPtr2 - vPtr would produce 2 Pointer comparison ( ) See which pointer points to the higher numbered array element Also, see if a pointer points to 0 13

14 Example of Pointer Operations #include int main() {int *vPtr; int *vPtr2; int v[5] = {10,20,30,40,50}; int temp; int *p, *q; vPtr= v; printf("Address of vPtr : %d Contents of vPtr : %d\n", &vPtr, vPtr); printf("Address of v[0] : %d\n", &v); vPtr +=2; printf("Address of vPtr + 2: %d\n", vPtr); vPtr +=2; printf("Address of vPtr + 4: %d\n", vPtr); vPtr2=&v[2]; vPtr=&v[0]; temp=vPtr2-vPtr; printf("Contents of temp : %d\n", temp); p=q; printf("Contents of p : %d q: %d\n", p,q); return 0;} Address of vPtr : 1245064 Contents of vPtr : 1245020 Address of v[0] : 1245020 Address of vPtr + 2: 1245028 Address of vPtr + 4: 1245036 Contents of temp : 2 Contents of p : 2147323904 q: 2147323904 14

15 The Relationship between Pointers and Arrays Arrays and pointers are closely related Array name like a constant pointer Pointers can do array subscripting operations Define an array b[5] and a pointer bPtr To set them equal to one another use: bPtr = b; The array name ( b ) is actually the address of first element of the array b[5] bPtr = &b[0]; Explicitly assigns bPtr to the address of first element of b 15

16 The Relationship between Pointers and Arrays Element b[3] Can be accessed by *(bPtr + 3) where * is the offset. Called pointer/offset notation Can be accessed by bPtr[3] Called pointer/subscript notation bPtr[3] same as b[3] Can be accessed by performing pointer arithmetic on the array itself *(b + 3) 16

17 Example Address of bPtr : 1245064 Contents of bPtr : 1245016 Address of b : 1245016 Contents of b[0]:10 10 10 bPtr points to b[0] = 10 I am accessing element b[3]!! Let see how many ways I can do it b[3] = 40 *(bPtr + 3) = 40 *(b + 3) = 40 bPtr[3] = 40 b[0] = 10 b[1] = 20 b[2] = 30 b[3] = 40 b[4] = 50 b[5] = 0 b[6] = 0 b[7] = 0 b[8] = 0 b[9] = 0 #include int main() { int *bPtr ;int i; int b[10]={10,20,30,40,50}; bPtr = b; printf("Address of bPtr : %d Contents of bPtr : %d\n", &bPtr, bPtr); printf("Address of b : %d Contents of b[0]:%d %d %d\n", &b, b[0], *bPtr, *b); printf("bPtr points to b[0] = %d\n", *bPtr); printf("\nI am accessing element b[3]!!\nLet see how many ways I can do it\n"); printf("b[3] = %d\n", b[3]); printf("*(bPtr + 3) = %d\n", *(bPtr + 3)); printf("*(b + 3) = %d\n", *(b + 3)); printf("bPtr[3] = %d\n\n", bPtr[3]); for(i=0;i<10;i++) printf("b[%d] = %d\n", i, *(bPtr+i)); return 0; } 17

18 Arrays of Pointers Arrays can contain pointers For example: an array of strings char *suit[4] = {“Hearts”,“Diamonds”,“Clubs”,“Spades”}; Strings are pointers to the first character char * – each element of suit is a pointer to a char The strings are not actually stored in the array suit, only pointers to the strings are stored 18

19 Arrays of Pointers suit array has a fixed size, but strings can be of any size suit[3] suit[2] suit[1] suit[0]’H’’e’’a’’r’’t’’s’ ’\0’ ’D’’i’’a’’m’’o’’n’’d’’s’ ’\0’ ’C’’l’’u’’b’’s’ ’\0’ ’S’’p’’a’’d’’e’’s’ ’\0’ 19

20 Example #include #define N 5 int main() { char *studentName[N]; int i; for(i=0;i<5;i++) { printf("Enter student[%d] name : ", i); scanf("%s", studentName + i); printf("You just entered :\n%s\n", studentName + i); } return 0; } Enter student[0] name : ali You just entered : ali Enter student[1] name : abu You just entered : abu Enter student[2] name : cheah You just entered : cheah Enter student[3] name : dali You just entered : dali Enter student[4] name : gheeta You just entered : gheeta 20


Download ppt "Lecture 9 - Pointers 1. Outline Introduction Pointer Variable Definitions and Initialization Pointer Operators Calling Functions by Reference Pointer."

Similar presentations


Ads by Google