inst eecs berkeley edu cs61c su05 CS61C Machine Structures Lecture 3 C Pointers Arrays 2005 06 22 Andy Carle CS 61C L03 C Arrays 1 A Carle Summer 2005 UCB Address vs Value What good is a bunch of memory if you can t select parts of it Each memory cell has an address associated with it Each cell also stores some value Don t confuse the address referring to a memory location with the value stored in that location 101 102 103 104 105 23 CS 61C L03 C Arrays 2 42 A Carle Summer 2005 UCB Pointers A pointer is just a C variable whose value is the address of another variable After declaring a pointer int ptr ptr doesn t actually point to anything yet We can either make it point to something that already exists or allocate room in memory for something new that it will point to next time CS 61C L03 C Arrays 3 A Carle Summer 2005 UCB Pointers Declaring a pointer just allocates space to hold the pointer it does not allocate something to be pointed to Local variables in C are not initialized they may contain anything CS 61C L03 C Arrays 4 A Carle Summer 2005 UCB Pointer Usage Example 0xffff ffff Memory and Pointers 0xcafe 0000 0xbeef 0000 0x0000 0004 0x0000 0000 CS 61C L03 C Arrays 5 A Carle Summer 2005 UCB Pointer Usage Example 0xffff ffff Memory and Pointers int p v v 0xXXXXXXXX 0xcafe 0000 p 0xXXXXXXXX 0xbeef 0000 0x0000 0004 0x0000 0000 CS 61C L03 C Arrays 6 A Carle Summer 2005 UCB Pointer Usage Example 0xffff ffff Memory and Pointers int p v v 0xXXXXXXXX 0xcafe 0000 p 0xcafe 0000 0xbeef 0000 p v 0x0000 0004 0x0000 0000 CS 61C L03 C Arrays 7 A Carle Summer 2005 UCB Pointer Usage Example 0xffff ffff Memory and Pointers int p v v 0x0000 0017 0xcafe 0000 p v p 0xcafe 0000 0xbeef 0000 v 0x17 0x0000 0004 0x0000 0000 CS 61C L03 C Arrays 8 A Carle Summer 2005 UCB Pointer Usage Example 0xffff ffff Memory and Pointers int p v v 0x0000 001b 0xcafe 0000 p v p 0xcafe 0000 0xbeef 0000 v 0x17 p p 4 0x0000 0004 0x0000 0000 CS 61C L03 C Arrays 9 V p 4 A Carle Summer 2005 UCB Pointers in C Why use pointers If we want to pass a huge struct or array it s easier to pass a pointer than the whole thing In general pointers allow cleaner more compact code So what are the drawbacks Pointers are probably the single largest source of bugs in software so be careful anytime you deal with them Dangling reference premature free Memory leaks tardy free CS 61C L03 C Arrays 10 A Carle Summer 2005 UCB C Pointer Dangers What does the following code do void f int ptr ptr 5 S E G F A U L T on my machine os Not a nice compiler error like you would hope CS 61C L03 C Arrays 11 A Carle Summer 2005 UCB C Pointer Dangers Unlike Java C lets you cast a value of any type to any other type without performing any checking int x 1000 int p x invalid int q int x valid The first pointer declaration is invalid since the types do not match The second declaration is valid C but is almost certainly wrong Is it ever correct CS 61C L03 C Arrays 12 A Carle Summer 2005 UCB Pointers and Parameter Passing Java and C pass a parameter by value procedure function gets a copy of the parameter so changing the copy cannot change the original void addOne int x x x 1 int y 3 addOne y y is still 3 CS 61C L03 C Arrays 13 A Carle Summer 2005 UCB Pointers and Parameter Passing How to get a function to change a value void addOne int p p p 1 int y 3 addOne y y is now 4 CS 61C L03 C Arrays 14 A Carle Summer 2005 UCB Arrays 1 7 Declaration int ar 2 declares a 2 element integer array int ar 795 635 declares and fills a 2 elt integer array Accessing elements ar num returns the num t h element from 0 CS 61C L03 C Arrays 15 A Carle Summer 2005 UCB Arrays 2 7 Arrays are almost identical to pointers char string and char string are nearly identical declarations They differ in very subtle ways incrementing declaration of filled arrays Key Difference An array variable is a CONSTANT pointer to the first element CS 61C L03 C Arrays 16 A Carle Summer 2005 UCB Arrays 3 7 Consequences ar is a pointer ar 0 is the same as ar ar 2 is the same as ar 2 We can use pointer arithmetic to access arrays more conveniently Declared arrays are only allocated while the scope is valid char foo char string 32 return string is incorrect CS 61C L03 C Arrays 17 A Carle Summer 2005 UCB Arrays 4 7 Array size n want to access from 0 to n 1 int ar 10 i 0 sum 0 while i 10 sum sum ar i i i 1 sum ar i CS 61C L03 C Arrays 18 A Carle Summer 2005 UCB Arrays 5 7 Array size n want to access from 0 to n 1 so you should use counter AND utilize a constant for declaration incr Wrong int i ar 10 for i 0 i 10 i Right define ARRAY SIZE 10 int i a ARRAY SIZE for i 0 i ARRAY SIZE i Why SINGLE SOURCE OF TRUTH You re utilizing indirection and avoiding maintaining two copies of the number 10 CS 61C L03 C Arrays 19 A Carle Summer 2005 UCB Arrays 6 7 Pitfall An array in C does not know its own length bounds not checked Consequence We can accidentally access off the end of an array Consequence We must pass the array and its size to a procedure which is going to traverse it Segmentation faults and bus errors These are VERY difficult to find be careful You ll learn how to debug these in lab CS 61C L03 C Arrays 20 A Carle Summer 2005 UCB Arrays 7 7 In Functions An array parameter can be declared as an array or a pointer an array argument can be passed as a pointer Can be incremented int strlen char s int strlen char s int n 0 int n 0 while s n 0 while s n 0 n n return n return n Could be written while s n CS 61C L03 C Arrays 21 A Carle Summer 2005 UCB Pointer Arithmetic 1 5 Since a pointer is just a mem address we can add to it to traverse an array p 1 returns a ptr to the next array elt p 1 vs p vs p 1 vs p x p p p 1 x p x p p p 1 x p What if we have an array of large structs objects C takes care of it In reality p …
View Full Document
Unlocking...