A Crash Course in C
Jalal Kawash
2
Section Objectives
At the end of this section you will
1. Learn how to write programs in C
2. Use C pointers and athematic
3. Exploit I/O files
3
Outline
1. Basics
2. Functions
3. Branching and looping
4. Arrays
5. Pointers
6. Structures and memory allocation
7. Files
8. Mixing C and Assembly
4
5
Example C Program
6
Basic Data Types
Type Bytes Use
int 4
char 1
float 4
double 8
short 2 short int
long 8 long int
unsigned 4 unsigned int
7
Conversion and Casting
• C can do type conversions
• In general, a smaller-size type can be converted
to a larger-size type
▫ E.g. float = int
▫ int = short int
• Explicit conversion is done as follows:
▫ (datatype) expression
▫ avg = (float) sum/total
8
Basic Operators
• Addition (a+b)
• Subtraction (a-b)
• Multiplication (a*b)
• Division (a/b)
• Modulus division (a%b)
9
10
Functions
11
Value Parameters
• Do not change outside the function
Output: 0, 0
12
Reference Parameters
• Change outside the function
*n is a pointer
= variable
holding the
address on n
&n = address
of n
Output: 8, 9
13
Command-line Arguments
• Mechanism to collect user input from the command line:
prog <list of arguments>
• The main method can have two arguments:
▫ argc = argument count
▫ argv = argument vector
int main(argc,argv)
int argc;
char *argv[];
{
…
}
14
Command-line Arguments
• argc is computed by the compiler
• argv[0] = program name
15
16
17
Comparison and Logical Operators
• Comparison: ==, !=, <=, >=
• Logical:
▫ AND: &&
▫ OR: ||
▫ NOT: !
18
If Statement
19
Switch Statement
20
Bitwise Operators
Bitwise AND &
Bitwise OR |
Bitwise XOR ^
Left Shift <<
Right Shift >>
One’s complement ~
21
Examples
• value = eFlag & mask
• value = eFlag >> n
• value = eFlag << 3
• value ~= eFlag
• value |= eFlag
• value = (~0 ^ eFlag) << 5
22
While Loop
while (condition) {
body
}
23
24
Do-While Loop
do {
body
} while (condition);
Equivalent to:
body
while (condition) {
body
}
25
For Loop
for (initialization; condition; index update){
Body
}
int i;
for(i = 0; i < 100; i++)
printf("%d ",i);
26
27
continue and break
while (…) { while (…) {
… …
if(…) break; if(…) continue;
… …
} }
28
29
Arrays
• To declare:
int y[100];
int x[10][20];
• Static and external (to main()) arrays can be
initialized
static int y[] ={1,2,3,4,5,6};
int x[2][3] = {1,2,3,4,5,6}
// row major
30
31
32
Pointers
• A variable that contains an address (for another
object in memory)
• The address operator & returns the address of a
variable
• The indirection operator * declares a pointer
variable
33
Pointers Example
Variable n at some address abc
int n = 100;
abc 100
int *ptr; Variable ptr at some address fgh
fgh ?
ptr = &n; fgh abc
Variable m at some address lmn
int m = *ptr
lmn 100
34
Pointers Example Variable n at some address abc
abc 100
Variable ptr at some address fgh
int *m; fgh abc
Variable m at some address lmn
m = ptr; lmn abc
35
Pointer and Float Types
An address is an integer
float f, *g
• g = f or f = g
▫ Not allowed; compiler error
36
Pointer and Integer Types
int m, *n
•n = m
▫ Allowed, compiler warning
• n = (int*) m
▫ Allowed, manual address setting
•m = n
▫ Allowed, compiler warning
• m = (int) n
▫ Allowed, processing the address
37
Arrays and Pointers
• The array name (a) is a pointer to the first
element in an array (a[0])
int a[N], *ptr;
ptr = a; // array has two names now
ptr+n or a+n refer to a[n]
38
39
Pointer Arithmetic
int a[N], *ptr;
ptr = a; // array has two names now
ptr+n or a+n refer to a[n]
• a and ptr must be the same type
• a+n is n “type size” from a
• Type size depends on the type of a
▫ 4 bytes for int, 1 for char, 8 for long, etc …
40
Byte Addresses Memory Bytes
short *ptr; ptr ptr + 0
ptr + 1
ptr + 2
ptr + 3
41
Byte Addresses Memory Bytes
char *ptr; ptr + 0
ptr + 1
ptr + 2
ptr + 3
ptr + 4
ptr + 5
ptr + 6
ptr + 7
42
Byte Addresses Memory Bytes
int *ptr; ptr ptr + 0
ptr + 1
43
Pointer Arithmetic
• A pointer may be displayed as an unsigned
variable
• Pointers can be incremented or decremented
ptr++;
ptr -= 2;
44
Pointer Arithmetic Examples
float a[100], *fptr;
fptr = &a[0]; // same as fptr = a;
• The following equalities hold
• fptr + 5 == &a[5]
• ++fptr + 5 == &a[6]
• *(fptr + 5) == a[5]
• *(++fptr + 5) == a[6]
45
Pointer Arithmetic Examples
float a[100], *fp;
fp = &a[0];
• The following equalities hold
• *fp == a[0]
• *(fp) == a[0]
• *(fp + 6) == a[6]
• *(fp + 6) == *(a + 6)
46
Examples of Operations on Pointers
1. Obtaining the pointer’s address
int n,*p1,*p2;
p1 = &n;
p2 = &p1;
2. A pointer can be declared as a pointer to a
pointer
int **p2;
47
Examples of Operations on Pointers
3. Adding or subtracting
p1++;
4. Indirect operator
int n,m,*p1,*p2;
p1 = &n;
p2 = &m
*p1 = 20; \\ assign 20 to n
*p2 = 4 + (*p1)
\\ assign 4 + the value of n to m
48
Examples of Operations on Pointers
5. Finding the address of a pointer
p2 = &p1;
6. Finding the difference between two pointers
49
Strings
• A string is a character array terminated with NULL
char *name; \\ name[i] is a char
char *name[10]; \\ name[i] is a string
50
Pointers to Functions
• Declared as
type (*funcName)();
• Example: int (*f1)();
▫ Declares a pointer to a function that returns int
• Careful: int *f1();
▫ Declares a function that returns a pointer to int
51
Pointers to Functions
#include <stdio.h>
int isEven(int n){ return !(n%2);}
int isOdd(int n){ return (n%2);}
int main() {
int (*foo)(int);
foo = &isEven;
int m = foo(2);
/* Also can be called as */
m = (*foo)(2);
foo = &isOdd;
m = foo(2);
return 0;
}
52
53
Structures
• Groups variables into a record
struct Student {
long int id;
char fname[20];
char lname[20];
};
struct cpsc Student[50];
cpsc[15].id = 12345678;
54
Unions
• Similar to structures in syntax, but only holds the value
for one member only
• i.e., defines a singe variable
• The size is the size of the largest member
union Answers {
int answer1;
float answer2;
} someAnswers;
someAnswers.answer1 = 12;
someAnswers.answer2 = 15.5;
\\ erases answer1!
55
56
Memory Allocation
• Declaring a pointer to a buffer will only reserve
memory for the pointer, not the buffer
• Functions to allocate (reserve) memory in C:
▫ malloc()
▫ alloc()
▫ realloc()
▫ calloc()
▫ free()
57
ptr = malloc(size)
• Allocates size contiguous bytes
• ptr is a pointer to char type
• If allocation fails, malloc returns 0
• Include #stdlib.h
unsigned int size = 1024;
char *ptr;
ptr = malloc(size);
58
Allocating a buffer of 1024 floats
unsigned int size = 1024;
float *ptr;
ptr = (float *)
malloc((sizeof) float) * size);
▫
59
ptr = alloc(size)
• Not available in all systems
• Similar to malloc but initializes the buffer to
zeros.
• Not supported in GCC
60
ptr = realloc(ptr,newSize)
• Reallocates the old buffer of ptr to newSize
• Buffer can grow or shrink
unsigned int size = 1024;
char *ptr;
ptr = malloc(size);
…
ptr = realloc(ptr, size*2);
61
ptr = calloc(n,objSize)
• Allocates a buffer of objects
• Used to allocate memory for non-simple types
▫ Such as structures
• n is the buffer size
• objSize is the size of individual object size
62
free(ptr)
• Frees the space originally allocated with pointer
ptr
63
64
Files
• Declare: FILE *inFile, *outFile;
• Open: inFile = fopen(“fork.c”,”r”);
outfile = fopen(“fork1.c”,”w”);
• Read: fscanf(inFile, “%c”, &ch);
• Write: fprintf(outFile, “%c”, ch);
• Close: fclose(inFile);
fclose(outFile);
65
Files
• EOF: Delimits the end of a file
while (ch = fgetc(inFile) != EOF) {…}
• fopen returns NULL if unsuccessful
66