DEV Community

Cover image for C language from 0
Davide
Davide

Posted on

C language from 0

Learning C can seem intimidating at first, but with the right approach, you can master its basics and become proficient in no time. This guide introduces you to the fundamental concepts of C, guiding you step-by-step from the basics to more advanced topics.

Table of Contents

  1. Basics of C and Data Types
  2. User Input
  3. Conditional Shortcuts
  4. Switch Statements
  5. Arrays in C
  6. Nested Loops
  7. Functions in C
  8. Structs
  9. Pointers

Basics of C and Data Types

C programs follow a standard structure and use various data types for variables. A basic program looks like this:

#include <stdio.h>

int main() {
    printf("Hello, World!");
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Key Concepts:

  • Data types:
    • int: Integer numbers (e.g., int x = 10;).
    • float and double: Floating-point numbers for decimals (e.g., float pi = 3.14;).
    • char: Single characters or ASCII codes (e.g., char letter = 'A';).
    • bool: Boolean values (true or false) if you include <stdbool.h>.
// Data Types:
int a = 40; // Integer (4 bytes)
short int b = 32767; // Short Integer (2 bytes, range: -32,768 to 32,767)
unsigned int c = 4294967295; // Unsigned Integer (4 bytes, range: 0 to 4,294,967,295)
float d = 9.81; // Float (4 bytes, 6-7 digits precision, format: %f)
double e = 3.141592653589793; // Double (8 bytes, 15-16 digits precision, format: %lf)
bool f = true; // Boolean (1 byte, True/False, format: %d where 1=true and 0=false)
char g = 'e'; // Character (1 byte, can be used for character or number)
char h = 100; // Character (1 byte, format: %d for number or %c for ASCII, range: -128 to 127)
char name[] = "Example"; // String

// Variable declaration and initialization
int age; // Declaration
age = 5; // Initialization
char language = 'C'; // Declaration and Initialization

// Displaying variables
printf("You are %d years old", age); // For integers
printf("Hello %s", name); // For strings
printf("You are now learning %c", language); // For characters

// Format specifiers: %d -> int, %s -> String, %c -> Char, %f -> Float, %.(numberOfDecimals)f -> Float with specified decimal places
Enter fullscreen mode Exit fullscreen mode
  • Operators:
/*
+ = (Addition)
- = (Subtraction)
* = (Multiplication)
/ = (Division)
% = (Modulus)
++ = (Increment by one)
-- = (Decrement by one)
*/

//The result needs to be stored in a variable that have the type of the result

//Change data type:
int x = 5;
int y = 2;

float z = 5/2 = //Wrong result bc x and y are INT so we can modify the type

float z = 5 / (float)2 = 2.5 //Correct way

//To increment a single variable:
int x = 4

x += 2 // x = 6
x -= 2 // x = 2
x *= 2 // x = 8
x /= 2 // x = 2
Enter fullscreen mode Exit fullscreen mode

User Input

If you are using VS Code, you need to switch from the Output tab to the Terminal tab to run the program, because the terminal accepts user input.

int age;
char name[25];

// USER INPUT INT:
printf("How old are you? \n"); // Display "How old are you?"
scanf("%d", &age); // Specify the data type and the variable name
printf("You are %d years old", age);

// USER INPUT STRING (ARRAY OF CHAR):
printf("What's your name?");
scanf("%s", name);
printf("Hi %s, how are you?", name);

/*
scanf() doesn't read whitespace, so if you need to insert name and surname, you can use the fgets function:
Structure:
fgets(variable name, size, stdin)
*/

fgets(name, 25, stdin); // fgets also includes '\n' at the end
Enter fullscreen mode Exit fullscreen mode

C is case sensitive
If we need an uppercase value, we can modify the user input to get the correct value. For example:

#include <ctype.h>

// We ask the user to input uppercase F or uppercase C
char unit;

printf("Is the temperature in (F) or (C)?");
scanf(" %c", &unit); // Note the space before %c to consume any leading whitespace

// To modify the user input:
unit = toupper(unit);

// Now, even if the user inputs lowercase c or f, we save the uppercase value in unit

if(unit == 'C'){
    printf("The temperature is currently in Celsius.");
}
else if (unit == 'F'){
    printf("The temperature is currently in Fahrenheit.");
}
else{
    printf("%c isn't a correct value", unit);
}
Enter fullscreen mode Exit fullscreen mode

Conditional Shortcuts

C provides a shorthand for if-else conditions using the ternary operator:

int max = (a > b) ? a : b;
Enter fullscreen mode Exit fullscreen mode

This is equivalent to:

if (a > b) {
    max = a;
} else {
    max = b;
}
Enter fullscreen mode Exit fullscreen mode

It’s a clean and efficient way to write simple conditional logic.


Switch Statements

The switch statement allows you to handle multiple possible values for a variable:

char grade = 'A'; // Declare a variable 'grade' and initialize it with the value 'A'

switch (grade) { // Start a switch statement to check the value of 'grade'
    case 'A': // If 'grade' is 'A'
        printf("Excellent!\n"); // Print "Excellent!"
        break; // Exit the switch statement
    case 'B': // If 'grade' is 'B'
        printf("Good job!\n"); // Print "Good job!"
        break; // Exit the switch statement
    default: // If 'grade' is not 'A' or 'B'
        printf("Better luck next time.\n"); // Print "Better luck next time."
}
Enter fullscreen mode Exit fullscreen mode

Always include a default case to handle unexpected values.


Arrays in C

An array is a collection of variables of the same type stored sequentially in memory. For example:

int numbers[5] = {10, 20, 30, 40, 50};
Enter fullscreen mode Exit fullscreen mode

Key Concepts:

  • Accessing elements: Use the index of the array, starting from 0:
  printf("%d", numbers[0]); // Prints 10
Enter fullscreen mode Exit fullscreen mode
  • 2D Arrays: These are like matrices or grids:
  int matrix[2][3] = { // Declare a 2D array named 'matrix' with 2 rows and 3 columns
    {1, 2, 3}, // Initialize the first row with values 1, 2, and 3
    {4, 5, 6}  // Initialize the second row with values 4, 5, and 6
};
Enter fullscreen mode Exit fullscreen mode
  • Array of Strings: Arrays can store strings too:
  // Declare a 2D array named 'cars' with each string having a maximum length of 10 characters
  char cars[][10] = {"BMW", "Tesla", "Toyota"}; 
Enter fullscreen mode Exit fullscreen mode

Arrays are widely used for handling lists of data, grids, or tables.


Nested Loops

Nested loops are loops inside other loops, often used for handling grids or repeated patterns:

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        printf("%d ", i * j);
    }
    printf("\n");
}
Enter fullscreen mode Exit fullscreen mode

These are ideal for working with multi-dimensional arrays or creating complex outputs.


Functions in C

Functions allow you to reuse code. For example:

void greet() {
    // Define a function named 'greet' that takes no arguments and returns no value
    // A function can store multiple lines of code to perform a series of actions
    printf("Hello, World!\n"); // Print "Hello, World!" followed by a newline character
    printf("Welcome to learning C programming.\n"); // Print another message followed by a newline character
    printf("Let's start coding!\n"); // Print another message followed by a newline character
}

int main() {
    greet(); // Call the 'greet' function to execute its code
    return 0; // Return 0 to indicate that the program ended successfully
}
Enter fullscreen mode Exit fullscreen mode

Functions can accept arguments to make them more flexible:

void greet(char name[]) {
    printf("Hello, %s!\n", name);
}

int main() {
    greet("Alice");
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Using functions helps keep your code organized and reusable.


Structs

Structures (struct) group related variables under a single name:

// Define a structure named 'Player' with two members
struct Player {
    char name[50]; // A character array 'name' to store the player's name (maximum 50 characters)
    int score; // An integer 'score' to store the player's score
};

// Create an instance of the 'Player' structure and initialize it
struct Player player1 = {"Alice", 100}; // Initialize 'player1' with name "Alice" and score 100

// Print the player's name and score
printf("Name: %s, Score: %d", player1.name, player1.score); // Output: Name: Alice, Score: 100
Enter fullscreen mode Exit fullscreen mode

They are often used for creating complex data models, like records or objects.


Pointers

Pointers are variables that store memory addresses, allowing for efficient data handling:

int value = 42; // Declare an integer variable 'value' and initialize it with 42
int *ptr = &value; // Declare a pointer variable 'ptr' and initialize it with the address of 'value'
printf("Value: %d, Address: %p", *ptr, ptr); // Print the value pointed to by 'ptr' and the address stored in 'ptr'

// Explanation:
// - 'value' is an integer variable storing the value 42.
// - 'ptr' is a pointer to an integer, and it stores the address of the 'value' variable.
// - '*ptr' dereferences the pointer 'ptr' to get the value stored at the address it points to, which is 42.
// - 'ptr' itself contains the memory address where 'value' is stored.
// - The printf statement prints the dereferenced value (42) and the memory address of 'value'.
Enter fullscreen mode Exit fullscreen mode

Pointers are essential for dynamic memory allocation and low-level operations in C.


I'm learning C and have gathered useful information. Mastering these concepts will give you a solid foundation in C programming. Use this guide as a reference, practice regularly, and you'll quickly go from beginner to expert in C. Happy coding!

Top comments (0)