~~SLIDESHOW~~ ~~NOTOC~~ ====== Pointers 1 slides ====== Pointer fundamentals, syntax, and operations.((Portions loosely adapted from: Deitel, Harvey M., and Paul J. Deitel. "Pointers and Strings." In //C++: How to Program//. 3 ed. Upper Saddle River, NJ: Prentice Hall, 2001. 304-388.))\\ Mithat Konar\\ October 19, 2021 ===== Introduction ===== * **Pointers** found in many programming languages. * Important in C++ because a close relationship between pointers and arrays, C strings, and references. ===== Pointer variables ===== * Variables are stored in blocks of computer memory. * **base address**: the memory address of the first byte of this block. * **pointer variable**: a variable that stores the base address of some other variable. * Usefulness will be seen after understanding how to use them. ===== Two ways to think about pointers ===== * Pointers hardware model * Pointer visual model ===== Pointer hardware model ===== * Assume an ''int'' named ''count'' storing the value 7 and ''int''s occupy 4 bytes. ^ Variable name ^ Memory location ^ Memory contents across all four bytes (32 bits)^ |''count''|58000|''00000000000000000000000000000111''\\ (i.e. 7 in decimal)| |:::|58001|:::| |:::|58002|:::| |:::|58003|:::| * The address of ''count'' is the base address 58000. ===== Pointer hardware model ===== * A //pointer// variable set to point to ''count'' would store the value 58000. ^ Variable name ^ Memory location ^ Memory contents across all 8 bytes (64 bits) ^ |''countPtr''|64002|''00000000000000000000000000000000\\ 00000000000000001110001010010000''\\ (58000 in decimal)| |:::|64003|:::| |:::|...|:::| |:::|64009|:::| * The //value// of a pointer variable is the base address of another variable. ===== Pointer visual model ===== Given the ''count'' variable used above: {{ :cplusplus:ptr01.png?nolink |}} a pointer variable ''countPtr'' pointing to ''count'' would be represented as: {{ :cplusplus:ptr02.png?nolink |}} The //value// of ''countPtr'' is the box the arrow points to (i.e., the integer ''count''). ===== Pointer visual model ===== Changing the value of ''countPtr'' to point to ''num'': {{ :cplusplus:ptr03.png?nolink |}} ===== Pointer syntax basics ===== ===== Pointer declaration ===== * ''*'' character is used to indicate pointer variables in declarations and function parameter lists. * Type of data being pointed to must also be indicated. int *myPtr; // declare a pointer to an int bool *yourPtr; // declare a pointer to a bool * Location of the ''*'' character is flexible: int *myPtr; int* myPtr; int * myPtr; ===== Pointer declaration ===== * You can declare more than one pointer variable at a time: int *myPtr, *anotherOne; // declare two pointers to an int * But be careful:: int* myPtr, anotherOne; // a pointer and an int ===== Address operator ===== * To set the value of a pointer, you need the address of something. * **address operator** ''&'' returns the base address of a variable: int num = 42; cout << num << endl; // prints value held in variable num cout << &num << endl ; // prints the base address of variable num * Most environments show base addresses as [[http://www.cplusplus.com/doc/hex/|hexadecimal]] numbers. ===== Pointer assignment ===== * Declare an integer variable ''y'' and a pointer variable ''myPtr'' set to store the address of ("point to") ''y''. int y = 5; // declare an integer variable y int *myPtr; // declare a pointer to int myPtr = &y; // myPtr gets address of ("points to") y {{:cplusplus:ptr04a.png?nolink|}} ===== Pointer assignment ===== * Declare an integer variable ''y'' and a pointer variable ''myPtr'' set to store the address of ("point to") ''y''. int y = 5; // declare an integer variable y int *myPtr; // declare a pointer to int myPtr = &y; // myPtr gets address of ("points to") y ^ Variable name ^ Memory location ^ Memory contents ^ |''y''|52000|5| |:::|...|:::| |:::|52003|:::| |...|...|...| |''myPtr''|63002|52000| |:::|...|:::| |:::|63009|:::| ===== Pointer assignment ===== * Changing the value of pointer variables: double z = 3.33; double x = 42.0; double *myPtr; myPtr = &z; // myPtr gets address of z myPtr = &x; // myPtr now has address of x ===== Pinter initialization ===== * Local pointer variables in C++ are not automatically initialized. * Uninitialized pointers point to arbitrary memory. //Very dangerous.// * You can initialize when declared: int y = 5; int *myPtr = &y; // myPtr gets address of y ===== nullptr/NULL pointers ===== * You can set a pointer to a value that indicates that it is //pointing to nothing//: ''nullptr'' (C++11) or ''NULL'' (earlier versions). * Otherwise uninitialized pointers should be set to ''nullptr'' (or ''NULL''). int *yourPtr = nullptr; // yourPtr points to nothing int y = 5; yourPtr = &y; // yourPtr gets address of y * ''nullptr'' and ''NULL'' have an integer value of ''0'', so sometimes programmers use ''0'' or '''\0'''. ===== Operators for pointers ===== * **address operator** ''&'' (already covered). * **indirection** or **dereferencing operator** ''*'' (covered next). ===== Indirection/dereferencing operator ===== * **indirection** or **dereferencing** operator, ''*'', accesses the value of what its operand points to. int y = -1; // declare y and initialize its value int *myPtr = &y; // declare pointer and set it to point to y cout << *myPtr; // defererence myPtr (prints -1) ===== Indirection/dereferencing operator ===== * Dereferencing can be used to assign a value to a location in memory: int y = -1; // declare y and initialize its value int *myPtr = &y; // declare pointer and set it to point to y *myPtr = 7; // change value in y to 7 cout << y; // prints 7 * You can think of the indirection/dereferencing operator as meaning, “the_thing_at_the_end_of_”, as in: the_thing_at_the_end_of_myPtr = 7; ===== Indirection/dereferencing operator ===== * ''*'' and ''&'' operators complement each other. * The following expressions all evaluate as true: *&y == y &*myPtr == myPtr *&myPtr == myPtr ===== Example ===== /** Demonstrate basic pointer usage. */ #include using namespace std; int main() { int a; // a is an integer int *aPtr = nullptr; // aPtr is a pointer to an integer a = 7; // give a a value aPtr = &a; // set aPtr to the address of a cout << "The value of a is: " << a << endl << "The address of a is: " << &a << endl << "The value of aPtr is: " << aPtr << endl; cout << endl; cout << "The value of a is: " << a << endl << "The value of *aPtr is: " << *aPtr << endl; cout << endl; cout << "Showing that * and & are inverses of each other:" << endl << "&*aPtr = " << &*aPtr << endl << "*&aPtr = " << *&aPtr << endl; return 0; }