
Compare the C programming language to other languages by exploring pointers, heap allocation, and quirks, for learners already familiar with Java, Python, and more.
Download and install Visual Studio Community 2022 for desktop development with C++ and the MSVC compiler, keep it up to date, and restart after installation to enable C++ 20/23 features.
Discover how to install a Linux compiler with a package manager: update the package index, upgrade tools, and install g++ and gdb, focusing on g++ 12 on Ubuntu 22.04.
Install the correct compiler and debugger, set up Visual Studio Code with extensions and settings, and access the course code by cloning, forking, or downloading the repository as a zip.
Download and install VSCode, open the project folder, trust the workspace, install Coding tools extension pack and C C plus plus extension pack, and generate C config files.
Use the cc++ runner extension in vscode to compile and run C programs with msvc, gcc, or clang. Build with ctrl+alt+b and run with ctrl+alt+r, using c11 and enabled warnings.
C integers span 8- to 64-bit, with signed and unsigned options. Use the std int header for portable sizing and understand char as an 8-bit type.
Learn about float and double in C, their 32-bit and 64-bit representations, why they can't store most values exactly, and how to handle precision while avoiding equality comparisons.
Learn to print and read values in C using printf and scanf, with correct format specifiers for integers, floats, and characters, plus handling implicit conversions and cross-platform nuances.
Explain booleans and if statements in C, where true and false map to 1 and 0, the std bool header, and common practices like parentheses, == true, and yoda conditions.
Learn to initialize a variable using the C ternary operator for simple if-else logic, selecting the older age from two values, and note Python's different ternary style.
Learn how to use for, while, and do while loops in C and C++, including when to choose each loop and why do while guarantees at least one iteration.
Explore the difference between pre-increment and post-increment, and pre-decrement and post-decrement, with code examples in functions and for loops; note Python lacks these operators.
Learn to use enums and a switch statement in C with a vending machine example, covering cases, breaks, default handling, and prefixed enum names to avoid redefinition.
Compare two constant approaches in C: preprocessor defines and runtime const, and see how #define, #include, and compile-time rules shape immutability and initialization.
Convert a value between data types using (type) value syntax, and compare explicit casting with implicit conversions that may cause data loss, floating point inaccuracy, and memory implications.
Learn how to declare and define functions in a single source file, why the main function is the entry point, and how declarations enable calls across files with header files.
Learn how header files define the public interface for a multi-file C project, separating declarations from definitions and guiding library building and shipping as headers and object files.
Define include guards to prevent duplicate code from header file imports, using #ifndef, #define, and #endif, and understand their role in avoiding multiple definitions when headers are included.
Explore debugging C and C++ with gdb, lldb, or MSVC, compile in debug mode, set breakpoints, and use the VS code extension for easier debugging, noting release mode optimizations.
Compare debug and release modes by examining the generated assembler across gcc, clang, and msvc, noting that higher optimization levels, especially O3, often speed up code despite more lines.
Learn how the coding exercises are organized in each chapter, with an underscore exercise folder containing the exercise.md description, starting code to implement, and test cases to verify your solution.
Implement c functions to classify a single character as numeric, alpha, or alphanumeric, and convert to upper or lower case using ascii rules and scanf input.
Learn how pointers in C point to memory addresses, use ampersand to obtain a variable’s address, and print addresses with printf %p, linking pointers to integers.
Learn how call by value copies arguments into parameters, and call by reference uses pointers to modify the caller's variables, enabling multiple outputs in C.
Learn how C and C++ arrays store a single data type with a fixed compile-time size, use zero-based indexing, and support initialization.
Learn how arrays decay to pointers when passed to functions and why you must pass the array length as a parameter, with const input and mean calculation in C.
Learn to store text in C with character arrays and strings, including null terminators and printing with %s. Discover how to initialize, update by indexing, and avoid out-of-bounds access.
Implement four C programming functions all_of, any_of, none_of, and count for an integer array, using a length parameter and index-based iteration to return true/false or the occurrence count.
Learn to debug pretty print by inspecting array contents through pointers, using MSVC watch syntax with a pointer and element count, or gcc/clang with gdb/lldb to view all elements.
Learn to use clang-format, the common C and C++ formatter in VS Code, configured via dot clang-format and optional settings on save to produce a consistent, unified code layout.
Clang-tidy shows how a static code linter analyzes C/C++ code, flags issues like magic numbers and narrowing conversions, and can be configured in VS Code to run on save.
Learn how the stack stores local variables and the heap enables runtime, dynamically sized allocations with malloc and free, and how some languages manage heap memory automatically.
Learn to allocate memory for a dynamically sized array with malloc on the heap, cast the void pointer to the right type, check for null, and free it.
Explore null and void pointers in C, learn how to initialize, check for null, and dereference safely while managing heap memory with malloc and free to avoid invalid addresses.
Learn how calloc and realloc allocate and resize heap memory for arrays, compare zero initialization with memset, and perform safe allocation with null-pointer checks and memory freeing.
Show how const pointers differ from regular pointers in C, detailing when you can update the dereferenced value, when you can’t, and the roles of pointer-to-constant and constant-pointer.
Implement an iota function and an inclusive scan in C, using pointers, value copy semantics, and heap allocation. Learn constant input handling and memory options like malloc or calloc.
Learn how to use structs in C, including defining attributes with the struct keyword, initializing values with designated initializers, and accessing fields via dot or arrow operators.
Learn how typedef creates a struct alias, so you can replace struct friend with friend underscore t, and why defining the typedef in the struct helps prevent omissions.
Nest structs in C by embedding a date struct inside a friend struct with typedef date_t, and reuse a print date function and designated initializers for the birthday fields.
Learn to access struct members in C using the dot and arrow operators, depending on whether the left side is a pointer, with account and user data examples.
Learn how struct padding affects memory usage and how aligning by the largest type, then ordering fields from largest to smallest, reduces padding with examples using int, float, and double.
Model the ego vehicle and six neighbors with enums and structs on a three-lane highway, using lane arrays; print positions and velocities; convert speeds from km/h to m/s by 3.6.
Explore how the C standard library handles strings, including copying, concatenation, length, comparison, and substring search, and learn safe practices with underscore s and restricted buffers to prevent overflow.
Open and close files with fopen and fclose, read with fscanf, transform values, and write results with fprintf to an output file, using absolute paths.
Learn how to read and write lines with fgets and fputs, using a while loop, fixed line length, and basic string to number conversions via atoi.
Explore how stdin, stdout, and stderr are predefined streams, how fscanf reads input from the terminal, and how redirecting stdout and stderr to separate log files aids debugging.
Store and read a binary file containing a four-byte integer and a four-byte float using f write and f read, with the structure's address and size.
Implement string handling in C by converting characters to upper or lower case and implementing a search that returns a pointer to found character or null, using a while loop.
Explore obtaining the current time in C with the time function and Unix timestamp, then format it using localtime and struct tm for readable day, date, and time.
Measure cpu cycles and timing with the clock struct from the time header, computing duration between start and end points in seconds, milliseconds, microseconds, and nanoseconds; compile in release mode.
Learn how to parse command line arguments in a C program using argc and argv, print arguments, and cast values to int, float, and double, including scanf-like value parsing.
Explore how the assert statement acts as a simple unit test in C, evaluating a boolean condition at runtime and aborting the program on failure.
Explore macros and preprocessor defines in C and C++, including ndebug vs debug, ifdef/ifndef, and conditional compilation to enable logging, asserts, and test code for debug versus release builds.
Explore how the C standard library's qsort sorts an array via a user defined comparator, with const void pointers, size, and a function pointer, including casting to a double pointer.
Learn how static variables differ as local and global, their compile-time allocation in static memory, and how they survive across function calls to preserve state, private to the source file.
Explore the union type in C, compare it with structs, and learn unions store one value at a time and occupy the maximum size of their members.
Learn how variadic functions work, using printf as an example, and implement a custom function with a count parameter, va_list, va_start, and va_end to iterate and convert arguments.
Conclude with a quick start to the C programming language, highlighting its role as a foundation for many other languages and encouraging a review and topic suggestions for other courses.
Skip the beginner tutorials. You already know how to code – now learn C the efficient way.
You're a programmer. You understand variables, loops, and functions. What you need isn't another "Hello World" tutorial – you need the C-specific features that make it different from Python, Java, or Rust.
This course focuses on what matters: pointers, manual memory management, compilation internals, and low-level control.
What makes C different:
Memory & Pointers
Manual memory management (malloc, free)
Stack vs. Heap – where your data lives
Pointer arithmetic and common pitfalls
Preventing memory leaks and segfaults
Compilation & Tools
How compilation works (preprocessing to linking)
Clang-Tidy & Clang-Format for professional code
Debug vs. release builds
Cross-platform considerations
C-Specific Features
C-style strings and buffer safety
Structs without OOP
File I/O at low level
Function pointers and callbacks
Course structure:
6 hours of focused content – 66 lectures across 9 modules
Setup included – Windows, Linux, Mac compiler installation
All code examples – Download and experiment
Modern tooling – VS Code, Clang tools
Who should take this course:
Perfect for:
Python/Java/JavaScript developers transitioning to C
Engineers working with embedded systems or IoT
CS students needing practical C skills
Anyone exploring systems programming
Prerequisites:
Working knowledge of any programming language
No prior C experience required
What you'll achieve:
Write production-quality C code
Debug memory issues systematically
Understand legacy C codebases
Prepare for embedded/systems programming roles
Why C matters:
Everywhere – OS kernels, embedded devices, game engines
Performance – When speed is critical
Career – Embedded systems, firmware, IoT jobs
Foundation – Understand how high-level languages work under the hood
Enroll now and fast-track your systems programming journey – with 30-day money-back guarantee!
See you in the course!