1 / 34

Pointers

Pointers. Computer Science I. Formal Description. Data primitive (or just primitive) Any datum that can be read from or written to computer memory using one memory access Data aggregate (or just aggregate)

hansel
Télécharger la présentation

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

  2. Formal Description • Data primitive (or just primitive) • Any datum that can be read from or written to computer memory using one memory access • Data aggregate (or just aggregate) • Group of primitives that are logically contiguous in memory and that are viewed collectively as one datum • Byte • Smallest primitive

  3. Formal Description • Pointer (or memory pointer) • Primitive • Value is intended to be used as a memory address • A pointer points to a memory address • A pointer points to a datum • Kind of reference • To obtain that datum is to dereference the pointer

  4. Formal Description • References serve as a level of indirection • A pointer's value determines which memory address (that is, which datum) is to be used in a calculation • Because indirection is a fundamental aspect of algorithms, pointers are often expressed as a fundamental data type in programming languages

  5. Data Structures • Pointers help manage how data structures such as lists, queues and trees are implemented and controlled • Examples: start pointers, end pointers, and stack pointers • Absolute pointers • Actual physical address or a virtual address in virtual memory • Relative pointers • Offset from an absolute start address ("base") • Typically uses less bits than a full address, but requires one additional arithmetic operation to resolve

  6. Control Tables • Are used to control program flow • Make extensive use of pointers • Pointers • Usually embedded in a table entry • May be used to hold the entry points to subroutines to be executed • Can be indices to other separate, but associated, tables comprising an array of the actual addresses or the addresses themselves • Can be used to point (back) to earlier table entries (as in loop processing) or forward to skip some table entries (as in a switch or "early" exit from a loop)

  7. Architectural Roots • Pointers are a very thin abstraction on top of the addressing capabilities provided by most modern architectures • An address, or a numeric index, is assigned to each unit of memory in the system • Transforms all of memory into a very large array

  8. Architectural Roots • Given an address, the system provides an operation to retrieve the value stored at that address • Normally, a pointer is large enough to hold more addresses than there are units of memory in the system • However, some systems have more units of memory than there are addresses

  9. Uses • Primarily used for constructing references • Fundamental to constructing nearly all data structures • As well as in passing data between different parts of a program

  10. Uses • Arrays • Critical lookup operation typically involves a stage called address calculation which involves constructing a pointer to the desired data element in the array • This arithmetic is usually much more efficient if the data elements in the array have lengths that are divisible by powers of two • Padding is frequently used as a mechanism for ensuring this is the case, despite the increased memory requirement

  11. Uses • Linked lists • Used as references to tie one piece of the structure to another. • Parameters: Pass by reference • For making a function's modifications to a parameter visible to the function's caller • For returning multiple values from a function

  12. Uses • Allocation / Deallocation • Used to allocate and deallocate dynamic variables and arrays in memory • In order not to waste memory, it is good practice to deallocate a pointer when it is no longer needed • Failure to do so may result in a memory leak

  13. Basics • int *money; • This declares money as a pointer to an integer • Given the contents of memory are not guaranteed to be of any specific value, care must be taken to ensure that the address is valid • int *money = NULL; • If a NULL pointer is dereferenced then a runtime error will occur and execution will stop, usually with a segmentation fault

  14. Basics • Once declared, the next logical step is to point at something int a = 5; int *money = NULL; : money = &a; • money stores the address of a • For example, if a is stored at address 0x8130 then the value of money will be 0x8130

  15. Basics • To dereference the pointer, an asterisk is used • *money = 8; • I.e., take the contents of money, "locate" that address in memory and set its value to 8 • This example may be more clear if memory is examined directly

  16. Arrays • Array indexing is formally defined in terms of pointer arithmetic • C++ requires that array[i] be equivalent to *(array + i) • Arrays can be thought of as pointers to consecutive memory • The syntax for accessing arrays is identical to dereferencing pointers

  17. Arrays • For example … int array[5]; /* Declares 5 contiguous integers */ int *ptr = array; /* Arrays can be used as pointers */ ptr[0] = 1; /* Pointers can be indexed with array syntax */ *(array + 1) = 2; /* Arrays can be dereferenced with pointer syntax */ *(1 + array) = 3; /* Pointer addition is commutative */ 2[array] = 4; /* Subscript operator is commutative */ • This allocates a block of five integers and names the block array, which acts as a pointer to the block

  18. Dynamically allocated memory • malloc returns a consecutive block of memory of no less than the requested size that can be used as an array • While most operators on arrays and pointers are equivalent, it is important to note that the sizeof operator will differ • In this example, sizeof(array) will evaluate to 5*sizeof(int) (the size of the array), while sizeof(ptr) will evaluate to sizeof(int*), the size of the pointer itself • Default values of an array can also be declared int array[5] = {2,4,3,1,5};

  19. C++ Syntax • Given int array[5]… • array means 0x1000 • array+1 means • *array means to dereference the contents of array • Considering the contents as a memory address (0x1000) , look up the value at that location (0x0002). • array[i] means the ith index of array which is translated into *(array + i) • array + i is the memory location of the ith element of array • *(array + i) takes that memory address and dereferences it

  20. Linked List • Below is an example of the definition of a linked list in C /* the empty linked list is * represented by NULL or some * other signal value */ #define EMPTY_LIST NULL struct link { /* the data of this link */ void *data; /* the next link; EMPTY_LIST if this is the last link */ struct link *next; };

  21. Pass-by-address using pointers • Pointers can be used to pass variables by their address, allowing their value to be changed /* a copy of the int n is changed */ void not_alter(int n) { n = 360; } /* the actual variable passed (by address) is changed */ void alter(int *n) { *n = 120; } void func(void) { int x = 24; /*pass x's address as the argument*/ alter(&x); /* x now equal to 120 */ not_alter(x); /* x still equal to 120 */ }

  22. Dynamic memory allocation • Dynamically allocated blocks of memory are used to store data objects or arrays of objects • Most structured and object-oriented languages provide an area of memory, called the heap or free store, from which objects are dynamically allocated

  23. Dynamic memory allocation • The example below illustrates how structure objects are dynamically allocated and referenced /* Parts inventory item */ struct Item { int id; /* Part number */ char * name; /* Part name */ float cost; /* Cost */ }; /* Allocate and initialize a new Item object */ struct Item * make_item(const char *name) { struct Item * item; /* Allocate a block of memory for a new Item object */ item = malloc(sizeof(struct Item)); if (item == NULL) return NULL; /* Initialize the members of the new Item */ memset(item, 0, sizeof(struct Item)); item->id = -1; item->name = NULL; item->cost = 0.0; /* Save a copy of the name in the new Item */ item->name = malloc(strlen(name) + 1); if (item->name == NULL) { free(item); return NULL; } strcpy(item->name, name); /* Return the newly created Item object */ return item; }

  24. Dynamic memory allocation • The code below illustrates how memory objects are dynamically deallocated, i.e., returned to the heap or free store /* Deallocate an Item object */ void destroy_item(struct Item *item) { /* Check for a null object pointer */ if (item == NULL) return; /* Deallocate the name string saved within the Item */ if (item->name != NULL) { free(item->name); item->name = NULL; } /* Deallocate the Item object itself */ free(item); }

  25. Typed Pointers & Casting • In many languages, pointers must point to a specific data type • For example, if a pointer is declared as int*, then the language will attempt to prevent the programmer from pointing to objects which are not integers

  26. Typed Pointers & Casting • For example • int *money; • char *bags; • money would be an integer pointer and bags would be a char pointer. The following would yield a compiler warning of "assignment from incompatible pointer type" • bags = money;

  27. Typed Pointers & Casting • To suppress the compiler warning, you need to make the assignment by typecasting it • bags = (char *)money; • That is, cast the integer pointer of money to a char pointer and assign to bags

  28. Making Pointers Safer • Pointers allow a program to access objects that are not explicitly declared beforehand • Therefore they enable a variety of programming errors • However, it can be difficult to do some programming tasks without them • Given they can be directly manipulated as a number, then they can be made to point to unused addresses or to data which is being used for other purposes • Many languages (such as Java) replace pointers with a more opaque type of reference

  29. Making Pointers Safer • Wild pointer • Does not have any address assigned to it • Using such uninitialized pointers can cause unexpected behavior • Dangling pointer • Created by deallocating the memory region it points into • Dangerous and subtle • Some languages, like C++, support smart pointers, which use a simple form of reference counting to help track allocation of dynamic memory in addition to acting as a reference

  30. Null Pointer • Has a reserved value, often but not necessarily the value zero, indicating that it refers to no object • Used routinely to represent conditions such as the lack of a successor to the last element of a linked list • Any attempt to dereference a null pointer usually causes a run-time error • Left unhandled, the program terminates immediately • Two null pointers are guaranteed to compare equal

  31. Null Pointer • ANSI C guarantees that any null pointer will be equal to 0 in a comparison with an integer type • The macro NULL is defined as a null pointer constant, that is value 0 • Not an uninitialized pointer • Guaranteed to compare unequal to any valid pointer • malloc generally returns a null pointer if it is unable to allocate the memory region requested

  32. Double Indirection • A pointer can reference another pointer, requiring two dereference operations to get to the original value • This is sometimes necessary in order to provide correct behavior for complex data structures

  33. Double Indirection • For example … struct element { struct element * next; int value; }; struct element * head = NULL; • This uses a pointer to the first element in the list as a surrogate for the entire list • If a new value is added to the beginning of the list, head has to be changed to point to the new element

  34. Double Indirection • Using double indirection allows the insertion to be implemented correctly • It has the desirable side-effect of eliminating special case code to deal with insertions at the front of the list // Given a sorted list at *head, insert the element item at the first // location where all earlier elements have lesser or equal value. void insert(struct element **head, struct element *item) { struct element ** p; // p points to a pointer to an element for (p = head; *p != NULL; p = &(*p)->next) { if (item->value <= (*p)->value) break; } item->next = *p; *p = item; } // Caller does this: insert(&head, item); • If the value of item is less than that of head, the caller's head is properly updated to the address of the new item.

More Related