pointer basics

37
Prepared by Mohammed Sikander Technical Lead Cranes Software International Limited

Upload: mohammed-sikander

Post on 23-Jan-2018

52 views

Category:

Education


4 download

TRANSCRIPT

Page 1: Pointer basics

Prepared by Mohammed SikanderTechnical LeadCranes Software International Limited

Page 2: Pointer basics

int main( ){

int x = 10;printf(“x = %d “ , x); //Prints the value of x.printf(“&x = %p “ , &x);

}

[email protected] 2

& operator gets the address of variable.%p is the correct format specifier to print address.

Page 3: Pointer basics

1. int main( )2. {3. int x = 10;4. printf(“x = %d \n“ , x); //Prints the value of x.5. printf(“&x = %p \n“ , &x);6. int *ptr; //Declaration of pointer7. ptr = &x;8. printf(“ptr = %p \n” , ptr);9. printf(“*ptr = %d \n” , *ptr);10. }

[email protected] 3

6. * is used to declare a pointer9. * is used to get value at address (dereference)

Page 4: Pointer basics

1. int main( )2. {3. int x = 5, y = 8;4. int *p1 , p2;5. p1 = &x;6. p2 = &y;7. printf(“ *p1 = %d “ , *p1);8. printf(“ *p2 = %d “ , *p2);9. }

[email protected] 4

Page 6: Pointer basics

Pointer size is same irrespective of type.

Pointers are like shorcuts to files (in windows).A size of shortcut to a 1MB file, 1GB file , 200MB file is same

[email protected] 6

Page 7: Pointer basics
Page 9: Pointer basics

int main( ){

int x;printf(“ x = %d “ , x); //garbage value.int *ptr;printf(“ ptr = %p “ , ptr); //garbage address.printf(“ *ptr = %d “ ,*ptr);

}

[email protected] 9

Page 10: Pointer basics

int main( ){

int *ptr1; // unitialized pointerint *ptr2 = NULL; // NULL pointer

if(ptr2 != NULL) // Can be safeguardedprintf(“ *ptr2 = %d \n”, *ptr2);

if(ptr1 != NULL) // Cannot be safeguardedprintf(“ *ptr1 = %d \n”, *ptr1);

}

[email protected] 10

Page 11: Pointer basics

void update(int x){

x = x + 5;printf(“Update x = %d “ , x);

}int main( ){

int x = 2;update( x );printf(“Main x = %d “ , x);

}

[email protected] 11

Page 12: Pointer basics

void update(int *px){

*px = *px + 5;printf(“Update *px = %d “ , *px);

}int main( ){

int x = 2;update( &x );printf(“Main x = %d “ , x);

}

[email protected] 12

Page 15: Pointer basics

a = 3 , b = 7a = a + b; //10b = a – b; //3a = a – b; //7

[email protected] 15

a = 7 , b = 10a = a * b; //70b = a / b; //7a = a / b; //10

a = 5 , b = 10a = a ^ b; //b = a ^ b; //5a = a ^ b; //10

Page 16: Pointer basics

int main( ){

int arr[ ] = {12,23,34,54};printf(“ %p “ , &arr[0]);printf(“ %p “ , arr);

}

[email protected] 16

Array name gives the base address (address of first element of array )

Page 17: Pointer basics

int main( ){

int arr[ ] = {12,23,34,54};int *p1 = &arr[0];int *p2 = arr;

printf(“ %d “ , *p1);printf(“ %d “ , *p2);

}

[email protected] 17

Page 18: Pointer basics

The following arithmetic operations with pointers are legal:• add an integer to a pointer (+ and +=)• subtract an integer from a pointer(- and -=).• use a pointer as an operand to the ++ and -- operators.• subtract one pointer from another pointer, if they point

to objects of the same type.• compare two pointers• Operations meaningless unless performed on an array

• All other arithmetic operations with pointers are illegal.

Page 19: Pointer basics

Ptr = ptr + int When you add or subtract an integer to or from a

pointer, the compiler automatically scales the integer to the pointer's type. In this way, the integer always represents the number of objects to jump, not the number of bytes.

int x; // Assume address of x is 1000 int *ptr = &x; // ptr = 1000 ptr = ptr +1; // ptr-> 1004 and not 1001

Page 20: Pointer basics

int main( ){

int arr[ ] = {0x21343782 , 0x54562319};int *p1 = &arr[0];printf(“ &arr[0] = %p \n” , &arr[0]); //100printf(“ &arr[1] = %p \n” , &arr[1]); //104

printf(“ p1 = %p *p1 = %x” , p1 , *p1); //100p1++;printf(“ p1 = %p *p1 = %x” , p1 , *p1); //104

}

[email protected] 20

Page 21: Pointer basics

int main( ){

short int arr[ ] = {0x2134 , 0x5456};short int *p1 = &arr[0];printf(“ &arr[0] = %p \n” , &arr[0]); //100printf(“ &arr[1] = %p \n” , &arr[1]); //102

printf(“ p1 = %p *p1 = %x” , p1 , *p1); //100p1++;printf(“ p1 = %p *p1 = %x” , p1 , *p1); //102

}

[email protected] 21

Page 22: Pointer basics

int main( ){

int arr[ ] = {0x21343782 , 0x54562319};short int *p1 = &arr[0];printf(“ *p1 = %x \n” ,*p1);p1++;printf(“ *p1 = %x \n” ,*p1);

}

[email protected] 22

Page 23: Pointer basics

int main( ){

int arr[ 5 ] = {12,23,34,45,56};int *ptr = arr;for(int i = 0 ; i < 5 ; i++){

printf(“ %d “ , *ptr);ptr++;

}}

[email protected] 23

Page 24: Pointer basics

int main( ){

int arr[ 5 ] = {12,23,34,45,56};int *ptr = arr;for(int i = 0 ; i < 5 ; i++){

printf(“ %d “ , ptr[ i ]);}

}

[email protected] 24

Page 25: Pointer basics

int main( ){

int arr[ 5 ] = {12,23,34,45,56};for(int i = 0 ; i < 5 ; i++){

printf(“ %d “ , *(arr + i));}

}

[email protected] 25

Page 26: Pointer basics

void printArray(int arr[]){

printf(" %d " , sizeof(arr));

}

int main( ){

int arr[5] = {12,23,34,54,67};

printf(" %d " , sizeof(arr));

printArray( arr );}

[email protected] 26

Page 27: Pointer basics

[email protected] 27

void printArray(int arr[]){

arr++; //No Error

}

int main( ){

int arr[5] = {12,23,34,54,67};

// arr++; //ErrorprintArray( arr );

}

Page 29: Pointer basics

int main( ){

const int x= 5;

x = 20; //ERRORx++; //ERROR

}

[email protected] 29

int main( ){1. const int x= 5;2. int *ptr = &x;3. *ptr = 20;4. printf(“ %d “ , x);}

Page 30: Pointer basics

[email protected] 30

int main( ){1. const int x= 5;2. const int *ptr = &x;3. *ptr = 20;4. printf(“ %d “ , x);}

Page 31: Pointer basics

Constant Pointer : Pointer is fixed to one location.

Pointer to const : Pointer has read-only access.

[email protected] 31

int * const cp; const int * pc; Constant pointer should be initialized.

Page 32: Pointer basics

int main( ){

int x = 10 ;const int y = 20;const int * pc1 ;pc1 = &x;pc1 = &y;

}

[email protected] 32

int main( ){

int x = 10 ;const int y = 20;int * const cp1;int * const cp2 = &x;int * const cp3 = &y;const int * const cp4 = &y;cp2 = &y;

}

Page 33: Pointer basics

size_t strlen(const char *str);

[email protected] 33

size_t mystrlen(const char *str){

const char *end = str;while( *end != ‘\0’)

end++;return end – str;

}

Page 34: Pointer basics

char * strcpy(char *dest, const char *src);

[email protected] 34

void mystrcpy(char *dest, const char *src){

while(1){

*dest = *src;if(*dest == ‘\0’)

return;src++;dest++;

}}

Page 35: Pointer basics

char * strcpy(char *dest, const char *src);

[email protected] 35

void mystrcpy(char *dest, const char *src){

while((*dest++ = *src++)){}

}

Page 36: Pointer basics

int strcmp(const char *str1 , const char *str2);

[email protected] 36

int mystrcmp(const char *str1 , const char *str2){

while(1){

if(*str1 != *str2)return *str1 - *str2;

if(*str1 == ‘\0’)return 0;

str1++;str2++;

}}

while(*str1 == *str2 && *str1 != ‘\0’){

str1++;str2++;

}return *str1 - *str2;