1 / 18

Chapter 8 Pointers

Chapter 8 Pointers. Pointers. A pointer is a variable that contains the address of a variable. Pointers provide a powerful and flexible method for manipulating data in your programs; but they are difficult to master. Benefits of Pointers.

miya
Télécharger la présentation

Chapter 8 Pointers

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. Chapter 8Pointers

  2. Pointers • A pointer is a variable that contains the address of a variable. • Pointers provide a powerful and flexible method for manipulating data in your programs; but they are difficult to master.

  3. Benefits of Pointers • Pointers allow you to reference a large data structure in a compact way. • Pointers facilitate sharing data between different parts of a program. • Call-by-Reference • Pointers make it possible to reserve new memory during program execution.

  4. count countPtr count 7 7 Pointer Variable Declarations and Initialization • Pointer variables • Contain memory addresses as their values • Normal variables contain a specific value (direct reference) • Pointers contain address of a variable that has a specific value (indirect reference) • Indirection – referencing a pointer value

  5. Pointer Variable Declarations and Initialization • Pointer declarations • A pointer declaration takes the following form:type *identifier; e.g.int *myPtr; • Declares a pointer to an int (pointer of type int *) • Multiple pointers require using a * before each variable declaration int *myPtr1, *myPtr2; • Can declare pointers to any data type • Initialize pointers to 0, NULL, or an address • 0 or NULL– points to nothing (NULL preferred)

  6. yptr y y 5 yPtr Address of y is value of yptr 500000 600000 600000 5 Pointer Operators • & (address operator) • Returns the address of operand int y = 5; int *yPtr; yPtr = &y;// yPtr gets address of y • yPtr “points to” y

  7. Pointer Operators • * (indirection/dereferencing operator) • Returns a synonym/alias of what its operand points to • *yptr returns y (because yptr points to y) • * can be used for assignment • Returns alias to an object *yptr = 7; // changes y to 7 • * and & are inverses • They cancel each other out

  8. int rate; int *p_rate; rate = 500; p_rate = &rate; 1000 1001 1002 1003 Memory 500 1002 *p_rate p_rate rate /* Print the values */ printf(“rate = %d\n”, rate); /* direct access */ printf(“rate = %d\n”, *p_rate); /* indirect access */

  9. 1 /* Using the & and * operators */ The address of a is the value of aPtr. 2 3 #include <stdio.h> 4 The * operator returns an alias to what its operand points to. aPtr points to a, so *aPtr returns a. 5 int main() 6 { Notice how * and & are inverses 7 int a; /* a is an integer */ 8 int *aPtr; /* aPtr is a pointer to an integer */ 9 10 a = 7; 11 aPtr = &a; /* aPtr set to address of a */ 12 13 printf( "The address of a is %p" 14 "\nThe value of aPtr is %p", &a, aPtr ); 15 16 printf( "\n\nThe value of a is %d" 17 "\nThe value of *aPtr is %d", a, *aPtr ); 18 19 printf( "\n\nShowing that * and & are inverses of " 20 "each other.\n&*aPtr = %p" 21 "\n*&aPtr = %p\n", &*aPtr, *&aPtr ); 22 23 return 0; 24 } Program Output The address of a is 0012FF88 The value of aPtr is 0012FF88 The value of a is 7 The value of *aPtr is 7 Showing that * and & are inverses of each other. &*aPtr = 0012FF88 *&aPtr = 0012FF88

  10. Addressing and Dereferencing int a, b, *p; a = b = 7; p = &a; printf(“*p = %d\n”,*p); *p = 3; printf(“a = %d\n”,a); p = &b; *p = 2 * *p - a; printf(“b = %d \n”, b);

  11. Addressing and Dereferencing float x, y, *p; x = 5; y = 7; p = &x; y = *p; Thus, y = *p;  y = *&x;  y = x;

  12. Calling Functions by Reference • Call by reference with pointer arguments • Pass address of argument using & operator • Allows you to change actual location in memory • * operator • Used as alias/nickname for variable inside of function void double_it( int *number ) { *number = 2 * ( *number ); } • *number used as nickname for the variable passed

  13. 1 /* Cube a variable using call-by-reference 2 with a pointer argument */ Notice how the address of number is given - cubeByReference expects a pointer (an address of a variable). 3 4 5 #include <stdio.h> 6 Inside cubeByReference, *nPtr is used (*nPtr is number). 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 } Notice that the function prototype takes a pointer to an integer (int *). Program Output The original value of number is 5 The new value of number is 125

  14. /* Cube a variable using call by value */ #include <stdio.h> int CubeByValue (int n); int main(void) { int number = 5; printf(“The original value of number is %d\n”, number); number = CubeByValue(number); printf(“The new value of number is %d\n”,number); return 0; } int CubeByValue (int n) { return (n*n*n); }

  15. /* Swapping arguments (incorrect version) */ #include <stdio.h> void swap (int p, int q); int main (void) { int a = 3; int b = 7; printf(“%d %d\n”, a,b); swap(a,b); printf(“%d %d\n”, a, b); return 0; } void swap (int p, int q) { int tmp; tmp = p; p = q; q = tmp; }

  16. /* Swapping arguments (correct version) */ #include <stdio.h> void swap (int *p, int *q); int main (void) { int a = 3; int b = 7; printf(“%d %d\n”, a,b); swap(&a, &b); printf(“%d %d\n”, a, b); return 0; } void swap (int *p, int *q) { int tmp; tmp = *p; *p = *q; *q = tmp; } p q 3 7 q p 7 3

  17. #include <stdio.h>#include <math.h>/* * This function separates a number into three parts: a sign (+, -, or * blank), a whole number magnitude and a fraction part. * Preconditions: num is defined; signp, wholep and fracp contain * addresses of memory cells where results are to be stored * Postconditions: function results are stored in cells pointed to by * signp, wholep, and fracp */void separate(double num, char *signp, int *wholep, double *fracp){ double magnitude; if (num < 0) *signp = ‘-‘; else if (num == 0) *signp = ‘ ‘; else *signp = ‘+’; magnitude = fabs(num); *wholep = floor(magnitude); *fracp = magnitude - *wholep;}

  18. int main(){ double value; char sn; int whl; double fr; // Gets data printf(“Enter a value to analyze:”); scanf(“%lf”, value); // Separates data value in three parts separate(value, &sn, &whl, &fr); //Prints results printf(“Parts of %.4f\n sign: %c\n”, value, sn); printf(“whole number magnitude: %d\n”, whl); printf(“fractional part : %.4f\n”, fr); return 0;}

More Related