1 / 14

Computer Science 210 Computer Organization

Computer Science 210 Computer Organization. Pointers. The Pointer. C allows the programmer to access the address of a memory location and use it as a data value Pointers are also used to refer to dynamically allocated storage (from the system heap). The Address of Operator &.

vesta
Download Presentation

Computer Science 210 Computer Organization

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. Computer Science 210Computer Organization Pointers

  2. The Pointer • C allows the programmer to access the address of a memory location and use it as a data value • Pointers are also used to refer to dynamically allocated storage (from the system heap)

  3. The Address of Operator & int number = 10; printf("The value is %d\n", number); // The contents of number printf("The address is %p\n", &number); // The address of number The & operator returns the actual memory address (a large integer, probably) of a variable The printf format flag p is used to print an address

  4. Declaring a Pointer Variable int number = 10; int *alias; The * operator says that the variable alias can contain a pointer to a memory location that can hold an int number alias The memory for alias contains garbage until it is set to a value 10

  5. Assigning an Address int number = 10; int *alias; int aCopy = number; // Copies number’s value to aCopy alias = &number; // Copies number’s address to alias The variables number and aCopy name separate storage locations The variables number and alias can access the same storage location aCopy number alias The memory for alias now contains the address of number 10 10

  6. Access by Indirection (Dereferencing) int number = 10; int *alias = NULL; // Set the pointer variable to empty int aCopy = number; // Copies number’s value to aCopy alias = &number; // Copies number’s address to alias printf("The value is %d\n", number); printf("The value is %d\n", *alias); // Dereference to get value • The * operator is also the dereference operator • Its operand must be a pointer variable, and it must contain the address of another cell in memory • The value NULL from stdio is used to indicate the empty pointer

  7. Aliasing and Side Effects int number = 10; int *alias = NULL; // Set the pointer variable to empty int aCopy = number; // Copies number’s value to aCopy alias = &number; // Copies number’s address to alias (*alias) = 69; // Reset the storage by indirection printf("The value is %d\n", number); // Prints 69 • * Has a lower precedence than = • *alias and number access the same storage aCopy number alias Ouch!!! 10 69

  8. Input and Output Parameters • Parameters are passed by value, so they’re good as input-only parameters • Pointers can be used to implement pass by reference, so they’re good for output parameters (in functions that return multiple values) • Example: define a function that returns two quadratic roots, given the inputs a, b, and c

  9. Use & with the Actual Parameter #include <stdio.h> #include <math.h> int main(){ float a, b, c, root1, root2; printf("Enter a, b, and c: "); scanf("%f%f%f", &a, &b, &c); quadraticRoots(a, b, c, &root1, &root2); printf("Root1: %f\nRoot2: %f\n", root1, root2); } The function quadraticRoots has three input parameters and two output parameters The address of a variable is passed for each output parameter The function scanf also uses this mechanism

  10. Use * with the Formal Parameter #include <stdio.h> #include <math.h> void quadraticRoots(float a, float b, float c, float *root1, float *root2); int main(){ float a, b, c, root1, root2; printf("Enter a, b, and c: "); scanf("%f%f%f", &a, &b, &c); quadraticRoots(a, b, c, &root1, &root2); printf("Root1: %f\nRoot2: %f\n", root1, root2); } Input parameters Output parameters In the function header, the root1 and root2 parameters are of type pointer (*) to float This allows them to receive the addresses of float variables when the function is called

  11. Use * to Access or Modify Data #include <stdio.h> #include <math.h> void quadraticRoots(float a, float b, float c, float *root1, float *root2); int main(){ float a, b, c, root1, root2; printf("Enter a, b, and c: "); scanf("%f%f%f", &a, &b, &c); quadraticRoots(a, b, c, &root1, &root2); printf("Root1: %f\nRoot2: %f\n", root1, root2); } void quadraticRoots(float a, float b, float c, float *root1, float *root2){ (*root1) = - b + sqrt(b * b - 4 * a * c) / (2 * a); (*root2) = - b - sqrt(b * b - 4 * a * c) / (2 * a); } Input parameters Output parameters Use dereference (*) to store an integer in the implementation

  12. Pointers and Arrays • An array variable is just a name for the base address of the array storage in memory • Normally, an array variable is not an l-value, meaning that it cannot be the target of an assignment statement • But, this address can be copied to another variable, which can then be modified

  13. Process an Array Using [] #include <stdio.h> int main(){ int i, max = 5, array[max]; for (i = 0; i < max; i++) array[i] = i + 1; // Print ‘em using the array and the subscript operator for (i = 0; i < max; i++) printf("%d\n", array[i]); }

  14. Process the Array Using * #include <stdio.h> int main(){ int i, max = 5, array[max]; for (i = 0; i < max; i++) array[i] = i + 1; // Print ‘em using a pointer and dereference int *arrayPtr, *lastAddress = array + max - 1; for (arrayPtr = array; arrayPtr <= lastAddress; arrayPtr++) printf("%d\n", *arrayPtr); arrayPtr is an alias for array (the address of the first cell) lastAddress is the address of the last cell in the array structure arrayPtr is incremented to move through the array structure, and * is used to access each cell

More Related