1 / 8

Department of Computer and Information Science, School of Science, IUPUI

Department of Computer and Information Science, School of Science, IUPUI. CSCI N305. Pointers Call-by-Reference. Calling Functions by Reference . Call by reference with pointer arguments Pass address of argument using & operator Allows you to change actual location in memory

gerald
Télécharger la présentation

Department of Computer and Information Science, School of Science, IUPUI

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Department of Computer and Information Science,School of Science, IUPUI CSCI N305 Pointers Call-by-Reference

  2. Calling Functions by Reference • Call by reference with pointer arguments • Pass 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 formal parameter for variable inside of function void double_num ( int *number ) { *number = 2 * ( *number ); } • *number used as nickname for the actual variable passed

  3. 1 /* 2 Cube a variable using call-by-value 3 */ 4 5 #include <stdio.h> 6 7 int cubeByValue( int ); /* prototype */ 8 9 int main() 10 { 11 int number = 5; 12 13 printf( "The original value of number is %d", number ); 14 number = cubeByValue( number ); 15 printf( "\nThe new value of number is %d\n", number ); 16 17 return 0; 18 } 19 20 int cubeByValue( int n ) 21 { 22 return n * n * n; /* cube number in main */ 23 } Example of Calling Functions by Value Function prototype Initialize variables Call function Define function Program Output The original value of number is 5 The new value of number is 125

  4. Example of Calling Functions by Value int main() { int number = 5; number = cubeByValue( number ); } int main() { int number = 5; number = cubeByValue( number ); } int main() { int number = 5; number = cubeByValue( number ); } int main() { int number = 5; number = cubeByValue( number ); } int main() { int number = 5; number = cubeByValue( number ); } number int cubeByValue( int n ) { return n * n * n; } int cubeByValue( int n ) { return n * n * n; } int cubeByValue( int n ) { return n * n * n; } int cubeByValue( int n ) { return n * n * n; } int cubeByValue( int n ) { return n * n * n; } n 5 undefined number n 5 5 number n 5 5 125 number n undefined 5 number n 125 undefined

  5. 1 /* Fig. 7.7: fig07_07.c 2 Cube a variable using call-by-reference 3 with a pointer argument */ 4 5 #include <stdio.h> 6 7 void cubeByReference( int * ); /* prototype */ 8 9 int main() 10 { 11 int number = 5; 12 13 printf( "The original value of number is %d", number ); 14 cubeByReference( &number ); 15 printf( "\nThe new value of number is %d\n", number ); 16 17 return 0; 18 } 19 20 void cubeByReference( int *nPtr ) 21 { 22 *nPtr = *nPtr * *nPtr * *nPtr; /* cube number in main */ 23 } Example of Calling Functions by Reference Notice that the function prototype takes a pointer to an integer ( int * ). Notice how the address of number is given - cubeByReference expects a pointer (an address of a variable). Function prototype Initialize variables Call function Define function Program Output Inside cubeByReference, *nPtr is used (*nPtr is number). The original value of number is 5 The new value of number is 125

  6. nPtr number address of number 5 address of number 125 Example of Calling Functions by Reference int main() { int number = 5; cubeByReference( &number ); } int main() { int number = 5; cubeByReference( &number ); } int main() { int number = 5; cubeByReference( &number ); } Before the call by reference to cubeByReference: void cubeByReference( int *nPtr ) { *nPtr = *nPtr * *nPtr * *nPtr; } void cubeByReference( int *nPtr ) { *nPtr = *nPtr * *nPtr * *nPtr; } void cubeByReference( int *nPtr ) { *nPtr = *nPtr * *nPtr * *nPtr; } nPtr number undefined 5 After call by reference to cubeByReference and before *nPtr is cubed: n After *nPtr is cubed : nPtr number

  7. COMPUTER MEMORY CONSTANT MEMORY AREA myPtr1 x2 Ptr x3 case 3 case 2 case 1 x1 myPtr2 myPtr x case with using const VARIABLE MEMORY AREA Using the const Qualifier with Pointers • const qualifier • Variable cannot be changed • Use const if function does not need to change a variable • Attempting to change a const variable produces an error • const pointers • Point to a constant memory location • Must be initialized when declared • int *const myPtr1 = &x1; • Type int *const • Constant pointer to an int • x can be changed, but not *Ptr • const int *myPtr2 = &x2; • Regular pointer to a const int • const int *const Ptr = &x3; • const pointer to a const int

  8. 1 /* Fig. 7.13: fig07_13.c 2 Attempting to modify a constant pointer to 3 non-constant data */ 4 5 #include <stdio.h> 6 7 int main() 8 { 9 int x, y; 10 11 int * const ptr = &x; /* ptr is a constant pointer to an 12 integer. An integer can be modified 13 through ptr, but ptr always points 14 to the same memory location. */ 15 *ptr = 7; 16 ptr = &y; 17 18 return 0; 19 } Declare variables Declare const pointer to an int Change *ptr (which is x) Attempt to change ptr Output Changing *ptr is allowed – x is not a constant. Changing ptr is an error – ptr is a constant pointer. FIG07_13.c: Error E2024 FIG07_13.c 16: Cannot modify a const object in function main *** 1 errors in Compile ***

More Related