580 likes | 710 Views
http:// proglit.com /. the c language. SA. BY. 1972 by Ken Thompson and Dennis Ritchie. developed concurrently with Unix C++ and Objective-C in 1980’s ANSI C89, C90, and C99 GCC (Gnu Compiler Collection) MSVC (Microsoft Visual C++). http:// proglit.com /. imperative/procedural
E N D
the c language
SA BY
developed concurrently with Unix C++ and Objective-C in 1980’s ANSI C89, C90, and C99 GCC (Gnu Compiler Collection) MSVC (Microsoft Visual C++)
imperative/procedural • statically typed • weakly typed
control of memory explicitly manipulate individual bytes “portable assembly” compact data manual allocation
(how functions are called in machine code) calling convention assembly from C C from assembly
systems programming performance-sensitive code (operating systems, device drivers) (games, media players)
basic data types char 1-byte signed integer intn-byte signed integer float single-precision floating-point double double-precision floating-point
declarations typename; int monkey; float zebra;
functions returnTypename(parameters) {body}
int square(int n) { return n * n; } int cube(int n) { return square(n) * n; }
casting (type) expression int x = 35; foo((char) x);
!0 // 1 !1 // 0 !0.6 // 0 !3 // 0 !-76.5 // 0
void roger(int x) { if (x == 3) { int z = 9; foo(z); } else { bar(z); // z does not exist } ack(z); // z does not exist }
void roger(int x) { int z = 9; if (x == 3) { foo(z); } else { bar(z); } ack(z); }
int main() { printf(“Hello, world!”); return 0; }
value variables • float a = 9.3;
pointers (a data type representing an address) int*foo; double*bar; char*ack;
reference operator &lvalue char c; int*p; p = &c; // error inti; int*p; p = &i;
reference operator &lvalue char c; int*p; p = (int*) &c; inti; int*p; p = &i;
dereference operator *pointer inti = 3; int*p; p = &i; i = *p + 2;
int i; int*p; p = &i; *p = 6;
pointer arithmetic inti; int*p; p = &i + 2; i = *p;
can subtracta pointer from a pointer can’t adda pointer to a pointer
char*p; p = (char*) 0xB000FFFF; char c = *p;
int*p; p = 0; if (p) { … } // false
pointer comparisons • == != • > < • >= <= • !
(can violate data types) weak typing float f; f = 98.6; f = f – 2; char*p; p = (char*)&f + 2; *p = 1;
memory allocation malloc free
void*p; p = malloc(5); float*f; f = malloc(13); … free(p); free(f);
sizeof operator sizeoftype sizeof int sizeof double sizeof(float *)
int*p; p = malloc(7 * sizeof(int)); *(p + 6) = 35; … free(p);
int*p; p = malloc(7 * (sizeofint)); if (p == 0) { … // allocation failed } else { … // allocation succeeded free(p); }
(a stack-allocated contiguous block of memory) array typename[size]; float jack[8]; char jill[200];
inti[32]; char c[11]; int *p; p = i; *i = -6; *(i + 1) = 8; *(c + 7) = (char) 5;
int sum(int *arr, int n) { int i = 0; int sum = 0; while (i < n) { sum = *(arr + i) + sum; i = i + 1; } return sum; }
int a[30]; … intsumA = sum(a, 30); • int *b = malloc(20 * sizeof(int)); • … • intsumB = sum(b, 20);
char *fred() { char c[30]; return c; }
char *fred() { • char*c = malloc(30 * sizeof(char)); return c; } char*foo = fred(); … free(foo);