Title: Dale Roberts, Lecturer
1Department of Computer and Information
Science,School of Science, IUPUI
CSCI 230
Structures Functions and Arrays
- Dale Roberts, Lecturer
- Computer Science, IUPUI
- E-mail droberts_at_cs.iupui.edu
2Using Structures With Functions
- Passing structures to functions
- Pass entire structure or pass individual members
- Both pass call by value
- It is not a good idea to pass a structure to or
return from function.The better way is passing a
pointer to the structure to the functions and
returning a pointer from function. - To pass structures call-by-reference
- Pass its address
- Pass reference to it
- To pass arrays call-by-value
- Create a structure with the array as a member
- Pass the structure
3Using Structures With Functions (cont.)
- Example
- day_of_year(struct date pd)
-
- int i, day, leap
- day pd -gt day
- leap pd-gtyear4 0 pd-gtyear 100 0
pd-gtyear400 0 - for (i1 i lt pd -gt month i)
- day day_tableapi
- return (day)
-
- The declaration struct date pd
- says that pd is a pointer to a structure of the
type date - If p is a pointer to a structure, then p-gt
member_of_structure refers to the particular
members, like pd -gt year - p-gt member_of_structure is equivalent to
(p).member_of_structure - Notice . has higher precedence than
pd.year is wrong, since pd.year is not a
pointer. - Both -gt and . associate from left to right. So
p -gt q -gt member - are (p-gtq)-gtmember.
- Example emp.birthday.month are
(emp.birthday).month
4Using Structures With Functions (cont.)
- -gt and . both are at the highest precedence
(together with () for function and for array
subscripts) - Example
- struct
- int x
- int y
- p
- p-gtx is equivalent to (p-gtx) / increment
x, not p / - (p)-gtx / increment p before access x /
- p-gty / fetch whatever y points to /
- p-gty / increments y after accessing
whatever y point to / - (p-gty) / increments whatever y point to,
just like p-gty / - p-gty / increments p after accessing
whatever y point to /
5typedef
- typedef
- Creates synonyms (aliases) for previously defined
data types - Use typedef to create shorter type names
- Example
- typedef struct card CardPtr
- Defines a new type name CardPtr as a synonym for
type struct card - typedef does not create a new data type while it
only creates an alias - Example
-
-
6Array of Structures
- Example (before)
- char namePERSONNAMESIZE
- int tscorePERSON
- int mathPERSON
- int englishPERSON
- Initialization of structure array
- struct person_data
- .. .. .. ..
- person
- Jane,180,89,91,
- John,190,90,100,
- .. .. .. ..
- / similar to 2D array /
- Example using separated arrays
- average (int tscore, int math, int eng, int n)
-
struct person_data char nameNAMESIZE int
tscore int math int english personPERSON
(now) ?
the inner brace is not necessary Jane,180,89,91
, John,190,90,100, .. .. .. ..
?
Example using pointer to structure average
(struct person_data person, int n) int i,
total0,mathtotal 0, engtotal0 for (i0 iltn,
i) total person-gttscore mathtotal
person-gtmath engtotal person-gteng person
7Unions
- union
- Memory that contains a variety of objects over
time - Only contains one data member at a time
- Members of a union share space
- Conserves storage
- Only the last data member defined can be accessed
- union declarations
- Same as struct
- union Number
- int x
- float y
-
- union Number value
- Valid union operations
- Assignment to union of same type
- Taking address
- Accessing union members .
- Accessing members using pointers -gt
8Define union
Initialize variables Set variables Print
Program Output
Put a value in the integer member and print both
members. int 100 double -925595921174331360000
00000000000000000000000000000000000000000.00000 Â
Put a value in the floating member and print both
members. int 0 double 100.000000
9Bit Fields
- Bit field
- Member of a structure whose size (in bits) has
been specified - Enable better memory utilization
- Must be declared as int or unsigned
- Cannot access individual bits
- Declaring bit fields
- Follow unsigned or int member with a colon ()
and an integer constant representing the width of
the field - Example
- struct BitCard
- unsigned face 4
- unsigned suit 2
- unsigned color 1
-
- Unnamed bit field
- Field used as padding in the structure
- Nothing may be stored in the bits
- Unnamed bit field with zero width aligns next bit
field to a new storage unit boundary
struct Example unsigned a 13 unsigned
3 unsigned b 4
10Enumeration Constants
- Enumeration
- Set of integer constants represented by
identifiers - Enumeration constants are like symbolic constants
whose values are automatically set - Values start at 0 and are incremented by 1
- Values can be set explicitly with
- Need unique constant names
- Example
- enum Months JAN 1, FEB, MAR, APR, MAY,
JUN, JUL, AUG, SEP, OCT, NOV, DEC - Creates a new type enum Months in which the
identifiers are set to the integers 1 to 12 - Enumeration variables can only assume their
enumeration constant values (not the integer
representations)
11 1 January 2 February 3 March 4
April 5 May 6 June 7 July
8 August 9 September 10 October 11
November 12 December
12Storage Management
- C supports 4 functions, malloc(),
calloc(),free(), and cfree() for storage
management - malloc(n)
- allocate a node while its content is still
garbage - n is an integer, indicating the size of memory in
byte which you would like to allocate - malloc() return a character pointer to that
memory - So, you have to use cast operator (type), to
change the type of the pointer. - Example
- int ip
- ip (int) malloc(sizeof(int))
- struct treeNode tp
- tp (struct tnode ) malloc(sizeof(struct
tnode))
13Storage Management (cont.)
- free(p)
- free() will release the memory allocated by
malloc(). - p is the pointer containing the address
returning from malloc(). - Example
- int ip
- ip (int) malloc(sizeof(int))
- ... .. ..
- free(ip) / Question can you free(ip) after
ip ? / - Example
- struct treeNode tp
- tp(struct treeNode )malloc(sizeof(struct
treeNode )) - ... .. ..
- free(tp)
- When there is no further memory, malloc() will
return NULL pointer. It is a good idea to check
the returning value of malloc(). - if ((ip(int )malloc(sizeof(int))) NULL)
- printf(\nMemory is FULL\n)
- exit(1)
-
14Storage Management (cont.)
- calloc(n,size)
- calloc() allow you to allocate an n elements
array of same data type. Because n can be an
integer variable, you can use calloc() to
allocate a dynamic size array. - n is the element number of array that you want
to allocate. - size is the number of byte of each element.
- Unlike malloc(), calloc() guarantees that memory
contents are all zero - Example allocate an array of 10 elements
- int ip
- ip (int) calloc(10, sizeof(int))
- (ip1) refer to the 2nd element, the same as
ip1 - (ipi) refer to the i1th element, the same
as ipi - Like malloc(), calloc() will return NULL, if no
further memory is available. - cfree(p)
- cfree() releases the memory allocated by
calloc(). - Example
- cfree(ip)