pointer basics

Post on 23-Jan-2018

52 Views

Category:

Education

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Prepared by Mohammed SikanderTechnical LeadCranes Software International Limited

int main( ){

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

}

mohammed.sikander@cranessoftware.com 2

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

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. }

mohammed.sikander@cranessoftware.com 3

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

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. }

mohammed.sikander@cranessoftware.com 4

mohammed.sikander@cranessoftware.com 5

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

mohammed.sikander@cranessoftware.com 6

mohammed.sikander@cranessoftware.com 8

int main( ){

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

}

mohammed.sikander@cranessoftware.com 9

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);

}

mohammed.sikander@cranessoftware.com 10

void update(int x){

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

}int main( ){

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

}

mohammed.sikander@cranessoftware.com 11

void update(int *px){

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

}int main( ){

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

}

mohammed.sikander@cranessoftware.com 12

mohammed.sikander@cranessoftware.com 13

mohammed.sikander@cranessoftware.com 14

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

mohammed.sikander@cranessoftware.com 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

int main( ){

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

}

mohammed.sikander@cranessoftware.com 16

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

int main( ){

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

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

}

mohammed.sikander@cranessoftware.com 17

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.

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

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

}

mohammed.sikander@cranessoftware.com 20

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

}

mohammed.sikander@cranessoftware.com 21

int main( ){

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

}

mohammed.sikander@cranessoftware.com 22

int main( ){

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

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

}}

mohammed.sikander@cranessoftware.com 23

int main( ){

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

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

}

mohammed.sikander@cranessoftware.com 24

int main( ){

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

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

}

mohammed.sikander@cranessoftware.com 25

void printArray(int arr[]){

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

}

int main( ){

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

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

printArray( arr );}

mohammed.sikander@cranessoftware.com 26

mohammed.sikander@cranessoftware.com 27

void printArray(int arr[]){

arr++; //No Error

}

int main( ){

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

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

}

mohammed.sikander@cranessoftware.com 28

int main( ){

const int x= 5;

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

}

mohammed.sikander@cranessoftware.com 29

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

mohammed.sikander@cranessoftware.com 30

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

Constant Pointer : Pointer is fixed to one location.

Pointer to const : Pointer has read-only access.

mohammed.sikander@cranessoftware.com 31

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

int main( ){

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

}

mohammed.sikander@cranessoftware.com 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;

}

size_t strlen(const char *str);

mohammed.sikander@cranessoftware.com 33

size_t mystrlen(const char *str){

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

end++;return end – str;

}

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

mohammed.sikander@cranessoftware.com 34

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

while(1){

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

return;src++;dest++;

}}

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

mohammed.sikander@cranessoftware.com 35

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

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

}

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

mohammed.sikander@cranessoftware.com 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;

mohammed.sikander@cranessoftware.com 37

top related