Basics
Hello World
#include int main(void) { printf("Hello, World!\n"); return 0; }
Compile & Run
gcc -o app main.c # compile gcc -Wall -Wextra -std=c17 main.c # strict ./app # run
Comments
// single-line comment (C99+) /* multi-line comment */
Data Types
Primitive Types
char1 byte, character or small integer
shortAt least 16 bits
intAt least 16 bits (typically 32)
longAt least 32 bits
long longAt least 64 bits (C99+)
float32-bit IEEE-754
double64-bit IEEE-754
_Bool / bool0 or 1 (use for bool)
Fixed-Width Types (stdint.h)
int8_t, uint8_tExact 8-bit signed / unsigned
int16_t, uint16_tExact 16-bit
int32_t, uint32_tExact 32-bit
int64_t, uint64_tExact 64-bit
size_tUnsigned, result of sizeof
Type Casting
int i = (int)3.14; // explicit cast double d = (double)5 / 2; // 2.5, not 2 char c = (char)65; // 'A'
Control Flow
If / Else
if (x > 0) { printf("positive\n"); } else if (x == 0) { printf("zero\n"); } else { printf("negative\n"); }
Switch
switch (choice) { case 1: printf("one\n"); break; case 2: printf("two\n"); break; default: printf("other\n"); }
Loops
for (int i = 0; i < 10; i++) { } while (condition) { } do { } while (condition);
Jump Statements
breakExit innermost loop or switch
continueSkip to next iteration
returnExit function with optional value
goto labelJump to label (use sparingly)
Functions
Declaration & Definition
int add(int a, int b); // prototype int add(int a, int b) { return a + b; }
Function Pointers
int (*op)(int, int) = add; int result = op(3, 4); // calls add(3, 4) typedef int (*MathFn)(int, int); MathFn fn = add;
Static Functions
// visible only within this translation unit static int helper(int x) { return x * 2; }
Pointers
Pointer Basics
int x = 42; int *p = &x; // p points to x printf("%d\n", *p); // dereference: 42 *p = 100; // x is now 100
Pointer Arithmetic
int arr[] = {10, 20, 30}; int *p = arr; printf("%d\n", *(p + 1)); // 20 printf("%d\n", p[2]); // 30 (same as *(p+2))
Common Pointer Patterns
int *p = NULLNull pointer (always initialize)
void *Generic pointer (must cast to use)
const int *pPointer to constant (cannot modify value)
int *const pConstant pointer (cannot reassign pointer)
int **ppPointer to pointer (double indirection)
Arrays & Strings
Arrays
int nums[5] = {1, 2, 3, 4, 5}; int matrix[2][3] = {{1,2,3}, {4,5,6}}; int len = sizeof(nums) / sizeof(nums[0]);
String Functions (string.h)
strlen(s)Length (excluding null terminator)
strcpy(dst, src)Copy string (unsafe, prefer strncpy)
strncpy(dst, src, n)Copy at most n characters
strcat(dst, src)Concatenate strings
strcmp(a, b)Compare: 0 if equal, <0 or >0 otherwise
strchr(s, c)Find first occurrence of character
strstr(haystack, needle)Find substring
String Literals
char greeting[] = "hello"; // mutable array const char *msg = "world"; // pointer to literal char buf[64]; snprintf(buf, sizeof(buf), "%s %s", greeting, msg);
Structs
Definition & Usage
struct Point { double x; double y; }; struct Point p = {1.0, 2.0}; printf("(%g, %g)\n", p.x, p.y);
Typedef
typedef struct { char name[50]; int age; } Person; Person p = {"Alice", 30};
Struct Pointers
void set_age(Person *p, int age) { p->age = age; // arrow operator }
Enums & Unions
enum Color { RED, GREEN, BLUE }; union Data { int i; float f; char c; }; // union members share the same memory
Memory Management
Dynamic Allocation (stdlib.h)
int *arr = malloc(10 * sizeof(int)); if (arr == NULL) { /* handle error */ } arr = realloc(arr, 20 * sizeof(int)); free(arr); arr = NULL; // avoid dangling pointer
Allocation Functions
malloc(size)Allocate uninitialized memory
calloc(count, size)Allocate and zero-initialize
realloc(ptr, size)Resize previously allocated block
free(ptr)Release allocated memory
Common Pitfalls
Memory leakForgetting to free() allocated memory
Double freeCalling free() on same pointer twice
Dangling pointerUsing pointer after free() — set to NULL
Buffer overflowWriting past allocated bounds
File I/O
Reading Files
FILE *f = fopen("data.txt", "r"); if (!f) { perror("open"); return 1; } char line[256]; while (fgets(line, sizeof(line), f)) printf("%s", line); fclose(f);
Writing to Files
FILE *f = fopen("out.txt", "w"); fprintf(f, "value: %d\n", 42); fputs("hello\n", f); fclose(f);
File Modes
"r"Read (file must exist)
"w"Write (truncates or creates)
"a"Append (creates if needed)
"rb", "wb"Binary read / write
"r+"Read and write (file must exist)
Preprocessor
Directives
#include // system header #include "myheader.h" // local header #define PI 3.14159 #define MAX(a, b) ((a) > (b) ? (a) : (b))
Conditional Compilation
#ifdef DEBUG printf("debug: x = %d\n", x); #endif #ifndef HEADER_H /* include guard */ #define HEADER_H /* ... */ #endif
Common Macros
__FILE__Current source file name
__LINE__Current line number
__func__Current function name (C99+)
__DATE__Compilation date string
NULLNull pointer constant
sizeof(x)Size of type or variable in bytes