DOC PREVIEW
Berkeley COMPSCI 61C - Lecture Notes

This preview shows page 1-2 out of 7 pages.

Save
View full document
View full document
Premium Document
Do you want full access? Go Premium and unlock all 7 pages.
Access to all documents
Download any document
Ad free experience
View full document
Premium Document
Do you want full access? Go Premium and unlock all 7 pages.
Access to all documents
Download any document
Ad free experience
Premium Document
Do you want full access? Go Premium and unlock all 7 pages.
Access to all documents
Download any document
Ad free experience

Unformatted text preview:

CS61C L3 C Pointers (1) Beamer, Summer 2007 © UCBScott Beamer, Instructorinst.eecs.berkeley.edu/~cs61cCS61C : Machine StructuresLecture #3 – C Strings, Arrays, & Malloc2007-06-27Sun announces new supercomputer:Sun ConstellationCS61C L3 C Pointers (2) Beamer, Summer 2007 © UCBReview• All declarations go at the beginning ofeach function.• Only 0 and NULL evaluate to FALSE.• All data is in memory. Each memorylocation has an address to use to referto it and a value stored in it.• A pointer is a C version of theaddress.• * “follows” a pointer to its value• & gets the address of a valueCS61C L3 C Pointers (3) Beamer, Summer 2007 © UCBHas there been an update to ANSI C?• Yes! It’s called the “C99” or “C9x” std• Thanks to Jason Spence for the tip• Referenceshttp://en.wikipedia.org/wiki/Standard_C_libraryhttp://home.tiscalinet.ch/t_wolf/tw/c/c9x_changes.html• Highlights•<inttypes.h>: convert integer types (#38)•<stdbool.h> for boolean logic def’s (#35)•restrict keyword for optimizations (#30)• Named initializers (#17) for aggregate objsCS61C L3 C Pointers (4) Beamer, Summer 2007 © UCBPointers & Allocation (1/2)• After declaring a pointer:int *ptr;ptr doesn’t actually point to anythingyet. We can either:• make it point to something that alreadyexists, or• allocate room in memory for somethingnew that it will point to… (later)CS61C L3 C Pointers (5) Beamer, Summer 2007 © UCBPointers & Allocation (2/2)• Pointing to something that alreadyexists:int *ptr, var1, var2;var1 = 5;ptr = &var1;var2 = *ptr;• var1 and var2 have room implicitlyallocated for them.ptr var1?var2?5 5? CS61C L3 C Pointers (6) Beamer, Summer 2007 © UCBMore C Pointer Dangers• Declaring a pointer just allocatesspace to hold the pointer – it does notallocate something to be pointed to!• Local variables in C are not initialized,they may contain anything.• What does the following code do?void f(){ int *ptr; *ptr = 5;}CS61C L3 C Pointers (7) Beamer, Summer 2007 © UCBArrays (1/6)• 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 numth element.CS61C L3 C Pointers (8) Beamer, Summer 2007 © UCBArrays (2/6)• Arrays are (almost) identical topointers•char *string and char string[] arenearly identical declarations• They differ in very subtle ways:incrementing, declaration of filled arrays• Key Concept: An array variable is a“pointer” to the first element.CS61C L3 C Pointers (9) Beamer, Summer 2007 © UCBArrays (3/6)• Consequences:•ar is an array variable but looks like apointer in many respects (though not all)•ar[0] is the same as *ar•ar[2] is the same as *(ar+2)• We can use pointer arithmetic to accessarrays more conveniently.• Declared arrays are only allocatedwhile the scope is validchar *foo() { char string[32]; ...; return string;} is incorrectCS61C L3 C Pointers (10) Beamer, Summer 2007 © UCBArrays (4/6)• Array size n; want to access from 0 ton-1, but test for exit by comparing toaddress one element past the array int ar[10], *p, *q, sum = 0;...p = &ar[0]; q = &ar[10];while (p != q) /* sum = sum + *p; p = p + 1; */sum += *p++;• Is this legal?• C defines that one element past end ofarray must be a valid address, i.e., notcause an bus error or address errorCS61C L3 C Pointers (11) Beamer, Summer 2007 © UCBArrays (5/6)• Array size n; want to access from 0 ton-1, so you should use counter ANDutilize a constant for declaration & incr• Wrongint i, ar[10];for(i = 0; i < 10; i++){ ... }• Right#define ARRAY_SIZE 10int i, a[ARRAY_SIZE];for(i = 0; i < ARRAY_SIZE; i++){ ... }• Why? SINGLE SOURCE OF TRUTH• You’re utilizing indirection and avoidingmaintaining two copies of the number 10CS61C L3 C Pointers (12) Beamer, Summer 2007 © UCBArrays (6/6)• Pitfall: An array in C does not know itsown length, & bounds not checked!• Consequence: We can accidentallyaccess off the end of an array.• Consequence: We must pass the arrayand its size to a procedure which isgoing to traverse it.• Segmentation faults and bus errors:• These are VERY difficult to find;be careful! (You’ll learn how to debugthese in lab…)CS61C L3 C Pointers (13) Beamer, Summer 2007 © UCBPointer Arithmetic (1/4)• Since a pointer is just a mem address, wecan add to it to traverse an array.• p+1 returns a ptr to the next array elt.• *p++ vs (*p)++ ?• x = *p++ ⇒ x = *p ; p = p + 1;• x = (*p)++ ⇒ x = *p ; *p = *p + 1;• What if we have an array of large structs(objects)?• C takes care of it: In reality, p+1 doesn’t add1 to the memory address, it adds the size ofthe array element.CS61C L3 C Pointers (14) Beamer, Summer 2007 © UCBPointer Arithmetic (2/4)• So what’s valid pointer arithmetic?• Add an integer to a pointer.• Subtract 2 pointers (in the same array).• Compare pointers (<, <=, ==, !=, >, >=)• Compare pointer to NULL (indicates thatthe pointer points to nothing).• Everything else is illegal since itmakes no sense:• adding two pointers• multiplying pointers• subtract pointer from integerCS61C L3 C Pointers (15) Beamer, Summer 2007 © UCBint get(int array[], int n){ return (array[n]);/* OR */ return *(array + n);}Pointer Arithmetic (3/4)• C knows the size of the thing a pointerpoints to – every addition orsubtraction moves that many bytes.• 1 byte for a char, 4 bytes for an int, etc.• So the following are equivalent:CS61C L3 C Pointers (16) Beamer, Summer 2007 © UCBPointer Arithmetic (4/4)• We can use pointer arithmetic to“walk” through memory:void copy(int *from, int *to, int n) { int i; for (i=0; i<n; i++) { *to++ = *from++; }}CS61C L3 C Pointers (17) Beamer, Summer 2007 © UCBPointers in C• Why use pointers?• If we want to pass a huge struct or array,it’s easier to pass a pointer than thewhole thing.• In general, pointers allow cleaner, morecompact code.• So what are the drawbacks?• Pointers are probably the single largestsource of bugs in software, so be carefulanytime you deal with them.• Dangling reference (premature free)• Memory leaks (tardy free)CS61C L3 C Pointers (18) Beamer, Summer 2007 © UCBC Pointer Dangers• Unlike Java, C lets you cast a value ofany type to any other type withoutperforming any checking.int x = 1000;int *p = x; /* invalid */int *q = (int *) x; /* valid */• The first pointer declaration


View Full Document

Berkeley COMPSCI 61C - Lecture Notes

Documents in this Course
SIMD II

SIMD II

8 pages

Midterm

Midterm

7 pages

Lecture 7

Lecture 7

31 pages

Caches

Caches

7 pages

Lecture 9

Lecture 9

24 pages

Lecture 1

Lecture 1

28 pages

Lecture 2

Lecture 2

25 pages

VM II

VM II

4 pages

Midterm

Midterm

10 pages

Load more
Download Lecture Notes
Our administrator received your request to download this document. We will send you the file to your email shortly.
Loading Unlocking...
Login

Join to view Lecture Notes and access 3M+ class-specific study document.

or
We will never post anything without your permission.
Don't have an account?
Sign Up

Join to view Lecture Notes 2 2 and access 3M+ class-specific study document.

or

By creating an account you agree to our Privacy Policy and Terms Of Use

Already a member?