Presentation is loading. Please wait.

Presentation is loading. Please wait.

Week 7 Part I Kyle Dewey. Overview Code from last time Array initialization Pointers vs. arrays Structs typedef Bubble sort (if time)

Similar presentations


Presentation on theme: "Week 7 Part I Kyle Dewey. Overview Code from last time Array initialization Pointers vs. arrays Structs typedef Bubble sort (if time)"— Presentation transcript:

1 Week 7 Part I Kyle Dewey

2 Overview Code from last time Array initialization Pointers vs. arrays Structs typedef Bubble sort (if time)

3 Code Wrap-Up

4 Array Initialization // fine int arr1[3] = { 1, 2 3 };... // compiler issues warning int arr2[2] = { 4, 5, 6 };... // arr3 contains { 1, 0, 0 }; int arr3[3] = { 1 };

5 Pointers vs. Arrays

6 Massive point of confusion that even C veterans mess up on C allows for pointers to be treated like arrays: char* string = “moo”; // string is a pointer string [ 0 ]; // returns ‘m’

7 Pointers vs. Arrays However, C also has an explicit array type char* string1 = “moo”; // pointer char string2[] = “cow”; // array

8 Pointers vs. Arrays Pointers can point anywhere, as long as it is of the correct type char character; char* string1; string1 = “moo”; string1 = “cow”; string1 = &character;

9 Pointers vs. Arrays Variables of the array type can only point to what they were initialized to char string[] = “foobar”; string[ 0 ]; // returns ‘f’ string = “foo”; // compiler error

10 Pointers vs. Arrays Variables of the array type must be initialized to something gcc gives an error ch allows this but crashes if you try to do anything with it char string[]; // compiler error

11 ...what? Questions: Why introduce a special type that is more restrictive than a pointer? Why can’t they be reassigned? Why is this useful?

12 Internal Representation A pointer is a variable that holds a memory address The array type is actually an address in and of itself Effectively a constant

13 Internal Representation Since it acts like a constant, it cannot be reassigned When we say: char string[] = “moo”; printf( “%s”, string );...the compiler replaces all occurrences of string with the actual memory address where “moo” is stored

14 Internal Representation When we say: char* string = “moo”; printf( “%s”, string );...the compiler will first look up what the value of string currently is, and pass that value along to printf as a memory address There is an extra step here

15 Analogy With the array type, it’s like: #define CONSTANT 5 printf( “%i”, CONSTANT ); With the pointer type, it’s like: int x = 5; printf( “%i”, x );

16 Decay Array types can decay to a pointer type This can be seen with functions: void foo( int* pointer ); int main() { int arr[] = { 1, 2, 3 }; foo( arr ); // legal }

17 What to Remember Pointers can act like arrays, but arrays cannot act like pointers When the compiler starts complaining about * versus [], this could be why

18 Structs

19 Problem We want to represent a phone book Each entry has: Name Phone number Address

20 Question Which type(s) is/are appropriate for: Name? Phone Number? Address?

21 Possible Representation Use parallel arrays Each array holds one kind of item Index N refers to all information for entry #N char** name; char** address; int* phoneNumber;

22 Problem Poor separation of concerns We have to pass around everything related to one person, which is annoying and error prone void printPerson( char* name, char* address, int phone );

23 Another Solution Use structures, aka. struct s Put all data relevant to one entry in one place struct person { char* name; char* address; int phone; };

24 Structs struct person { char* name; char* address; int phone; }; void printPerson( struct person p );

25 Accessing Structs Use the dot (.) operator void printPerson( struct person p ) { printf( “Name: %s\n”, p.name ); printf( “Address: %s\n”, p.address ); printf( “Phone: %i\n”, p.phone ); } struct person { char* name; char* address; int phone; };

26 Modifying Structs The dot (.) operator can be used along with assignment struct person { char* name; char* address; int phone; }; struct person p; p.name = “foo”; p.address = “123 Fake Street”; p.phone = 0123456789

27 Initializing Structs For a struct definition like so: struct pair { int x; int y; }; We can do: struct pair p = { 2, 3 }; struct pair p2 = {.x = 2,.y = 3 }; (Doesn’t work in ch, but it does in gcc)

28 Pointers to Structs Structs can also be accessed via pointers Can access like so: struct person p; struct person* pointer = &p; (*p).name = “foo”; (*p).address = (*p).name; (*p).phone = 0123456789

29 Pointers to Structs Structs can also be accessed via pointers Can also access with the more readable arrow operator struct person p; struct person* pointer = &p; p->name = “foo”; p->address = p->name; p->phone = 0123456789

30 Struct Semantics Consider again: void printPerson( struct person p ); When structs are passed, the whole thing is copied Note that this is a shallow copy

31 Shallow Copy struct person { char* name; char* address; int phone; }; “Bob”“124 Fake Street” 9876543210 nameaddress phone

32 Shallow Copy “Bob”“124 Fake Street” 9876543210 nameaddress phone 9876543210 phone nameaddress

33 Question struct foo { int x; }; void bar( struct foo f ) { f.x = 10; } int main() { struct foo f; f.x = 5; bar( f ); // what’s f.x? return 0; }

34 Question struct foo { char* x; }; void bar( struct foo f ) { f.x = “moo”; } int main() { struct foo f; f.x = “cow”; bar( f ); // what’s f.x? return 0; }

35 Question struct foo { int x; }; void bar( struct foo* f ) { f->x = 10; } int main() { struct foo f; f.x = 5; bar( &f ); // what’s f.x? return 0; }

36 Question struct foo { char* x; }; void bar( struct foo* f ) { f->x = “moo”; } int main() { struct foo f; f.x = “cow”; bar( &f ); // what’s f.x? return 0; }

37 Structs and Pointers Oftentimes programmers will prefer pointers to structs as opposed to just structs Avoids extra copying Possibly appropriate

38 typedef

39 Defines a new type that is an alias for another type

40 Example struct foo { int x; }; void bar( struct foo f ) { f.x = 10; } Before typedef...

41 Example struct foo { int x; }; typedef struct foo Foo; void bar( Foo f ) { f.x = 10; } After typedef

42 More Examples typedef long double ld; typedef unsigned long ul; typedef int SuperAwesome;

43 Uses Shorten type names A point of abstraction // for one computer typedef EightBytes int; // for another computer typedef EightBytes long;

44 Bubble Sort (If time)

45 Bubble Sort Another sorting algorithm Basic idea: Go through a list of numbers Compare them pairwise If a pair is out of order, swap them Keep doing this until no swaps occur

46 Example We want to sort according to integer <= 6241097

47 Example 6241097 firstsecond Swap occurred?: False

48 Example 2641097 firstsecond Swap occurred?: True

49 Example 2641097 firstsecond Swap occurred?: True

50 Example 2461097 firstsecond Swap occurred?: True

51 Example 2461097 firstsecond Swap occurred?: True

52 Example 2416097 firstsecond Swap occurred?: True

53 Example 2416097 firstsecond Swap occurred?: True

54 Example 2410697 firstsecond Swap occurred?: True

55 Example 2410697 firstsecond Swap occurred?: True

56 Example 2410697 firstsecond Swap occurred?: True

57 Example 2410679 firstsecond Swap occurred?: True

58 Example 2410679 firstsecond Swap occurred?: False

59 Example 2410679 firstsecond Swap occurred?: False

60 Example 2140679 firstsecond Swap occurred?: True

61 Example 2140679 firstsecond Swap occurred?: True

62 Example 2104679 firstsecond Swap occurred?: True

63 Example 2104679 firstsecond Swap occurred?: True

64 Example 2104679 firstsecond Swap occurred?: True

65 Example 2104679 firstsecond Swap occurred?: True

66 Example 2104679 firstsecond Swap occurred?: False

67 Example 1204679 firstsecond Swap occurred?: True

68 Example 1204679 firstsecond Swap occurred?: True

69 Example 1024679 firstsecond Swap occurred?: True

70 Example 1024679 firstsecond Swap occurred?: True

71 Example 1024679 firstsecond Swap occurred?: True

72 Example 1024679 firstsecond Swap occurred?: True

73 Example 1024679 firstsecond Swap occurred?: True

74 Example 1024679 firstsecond Swap occurred?: False

75 Example 0124679 firstsecond Swap occurred?:True

76 Example 0124679 firstsecond Swap occurred?:True

77 Example 0124679 firstsecond Swap occurred?:True

78 Example 0124679 firstsecond Swap occurred?:True

79 Example 0124679 firstsecond Swap occurred?:True

80 Example 0124679 firstsecond Swap occurred?:True

81 Example 0124679 firstsecond Swap occurred?:False

82 Example 0124679 firstsecond Swap occurred?:False

83 Example 0124679 firstsecond Swap occurred?:False

84 Example 0124679 firstsecond Swap occurred?:False

85 Example 0124679 firstsecond Swap occurred?:False

86 Example 0124679 firstsecond Swap occurred?:False

87 Code


Download ppt "Week 7 Part I Kyle Dewey. Overview Code from last time Array initialization Pointers vs. arrays Structs typedef Bubble sort (if time)"

Similar presentations


Ads by Google