DOC PREVIEW
Berkeley COMPSCI 61C - C Pointers and Arrays

This preview shows page 1-2-3-4 out of 11 pages.

Save
View full document
View full document
Premium Document
Do you want full access? Go Premium and unlock all 11 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 11 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 11 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 11 pages.
Access to all documents
Download any document
Ad free experience
Premium Document
Do you want full access? Go Premium and unlock all 11 pages.
Access to all documents
Download any document
Ad free experience

Unformatted text preview:

CS 61C L04 C Pointers (1) Wawrzynek Spring 2006 © UCB1/25/2006John Wawrzynek(www.cs.berkeley.edu/~johnw)www-inst.eecs.berkeley.edu/~cs61c/CS61C – Machine StructuresLecture 4 – C Pointers and ArraysCS 61C L04 C Pointers (2) Wawrzynek Spring 2006 © UCBCommon C Error°There is a difference betweenassignment and equality•a = b is assignment•a == b is an equality test°This is one of the most commonerrors for beginning C programmers!CS 61C L04 C Pointers (3) Wawrzynek Spring 2006 © UCBPointers & Allocation (1/2)°After declaring a pointer:int *ptr;ptr doesn’t actually point to anythingyet (well actually points somewhere -but don’t know where!). We caneither:• make it point to something that alreadyexists, or• allocate room in memory for somethingnew that it will point to… (next time)CS 61C L04 C Pointers (4) Wawrzynek Spring 2006 © 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?CS 61C L04 C Pointers (5) Wawrzynek Spring 2006 © 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;}CS 61C L04 C Pointers (6) Wawrzynek Spring 2006 © 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.CS 61C L04 C Pointers (7) Wawrzynek Spring 2006 © UCBArrays (1/6)°Declaration:int ar[2];declares a 2-element integer array. Anarray is really just a block of memory. int ar[] = {795, 635};declares and fills a 2-elt integer array.°Accessing elements:ar[num];returns the numth element.CS 61C L04 C Pointers (8) Wawrzynek Spring 2006 © UCBArrays (2/6)°Arrays are (almost) identical topointerschar *string and char string[] arenearly identical declarationsThey differ in very subtle ways:incrementing, declaration of filled arrays°Key Concept: An array variable is a“pointer” to the first element.CS 61C L04 C Pointers (9) Wawrzynek Spring 2006 © UCBArrays (3/6)°Consequences: int ar[10];ar is an array variable but looks like apointer in many respects (though not all)ar[0] is the same as *arar[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 incorrectCS 61C L04 C Pointers (10) Wawrzynek Spring 2006 © UCBArrays (4/6)°Array size n; want to access from 0 ton-1, can 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 errorCS 61C L04 C Pointers (11) Wawrzynek Spring 2006 © UCBArrays (5/6)°Array size n; want to access from 0 ton-1, so you should use counter ANDutilize a constant for declaration & incr• Wrong styleint i, ar[10];for(i = 0; i < 10; i++){ ... }• Right style#define ARRAY_SIZE 10int i, a[ARRAY_SIZE];for(i = 0; i < ARRAY_SIZE; i++){ ... }°Why? SINGLE SOURCE OF TRUTH• You’re avoiding maintaining two copiesof the number 10CS 61C L04 C Pointers (12) Wawrzynek Spring 2006 © 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…)CS 61C L04 C Pointers (13) Wawrzynek Spring 2006 © UCBSegmentation Fault vs Bus Error?°http://www.hyperdictionary.com/° Segmentation Fault• A fatal failure in the execution of a machinelanguage instruction resulting from theprocessor detecting an anomalous condition onits bus. Such conditions include invalid addressalignment (accessing a multi-byte number at anodd address), accessing a physical address thatdoes not correspond to any device, or someother device-specific hardware error. A buserror triggers a processor-level exception whichUnix translates into a “SIGBUS” signal which, ifnot caught, will terminate the current process.° Bus Error• An error in which a running Unix programattempts to access memory not allocated to itand terminates with a segmentation violationerror and usually a core dump.CS 61C L04 C Pointers (14) Wawrzynek Spring 2006 © UCBPointer Arithmetic (1/3)°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)+1 vs *p++ vs *(p+1) 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.CS 61C L04 C Pointers (15) Wawrzynek Spring 2006 © UCBPointer Arithmetic (2/3)°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 integerCS 61C L04 C Pointers (16) Wawrzynek Spring 2006 © UCBint get(int array[], int n){ return (array[n]);/* OR */ return *(array + n);}Pointer Arithmetic (3/3)°C knows the size of the thing a pointerpoints to – every addition orsubtraction moves that many bytes.°So the following are equivalent:CS 61C L04 C Pointers (17) Wawrzynek Spring 2006 © UCBC Strings°A string in C is an array of characters.char string[] = "abc";°How do you tell how long a string is?• Last character is followed by a 0 byte(null terminator)int strlen(char s[]){ int n = 0; while (s[n] != 0) n++; return n;}CS 61C L04 C Pointers (18) Wawrzynek Spring 2006 © UCBC Strings Headaches°One


View Full Document

Berkeley COMPSCI 61C - C Pointers and Arrays

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 C Pointers and Arrays
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 C Pointers and Arrays 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 C Pointers and Arrays 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?