Variables and Data Types

Loading concept...

🎒 The Magic Backpack: Understanding C Variables and Data Types

Imagine you have a magic backpack with special pockets. Each pocket can only hold ONE type of thing — some pockets are for tiny candies, some for big toys, some for nothing at all! That’s exactly how C stores information.


🏷️ Variables and Naming Rules

What is a Variable?

A variable is like a labeled jar in your kitchen. You write a name on the jar so you remember what’s inside!

int age = 10;

Here, age is the jar’s label, and 10 is what’s inside.

The Naming Rules (Super Important!)

Think of naming your pet. You can’t call it “123” or “my pet!” — that would be confusing!

✅ You CAN:

  • Start with a letter or underscore: score, _count, playerName
  • Use letters, numbers, and underscores: player1, high_score

❌ You CANNOT:

  • Start with a number: 1stPlace
  • Use spaces: my score
  • Use special symbols: score!, total$
  • Use reserved words: int, return
// Good names
int playerScore;
float _temperature;
char letter1;

// Bad names (won't work!)
// int 2fast;     // starts with number
// float my-age;  // has hyphen

Pro tip: Make names meaningful! x tells you nothing. playerHealth tells you everything!


📦 Basic Data Types

C has different “pocket sizes” for different kinds of information. Let’s meet them!

int — Whole Numbers

For counting things that can’t be cut in half (like people or apples).

int apples = 5;
int score = 100;
int temperature = -10;

Typically stores numbers from about -2 billion to +2 billion.

float — Decimal Numbers

For numbers with dots (like prices or measurements).

float price = 9.99;
float height = 5.8;

Has about 6-7 digits of precision.

double — Precise Decimals

Like float, but more precise — great for science!

double pi = 3.14159265359;
double distance = 384400.5;

Has about 15-16 digits of precision.

char — Single Characters

Holds ONE letter, number, or symbol. Uses single quotes!

char grade = 'A';
char symbol = '#x27;;
char digit = '7';
graph TD A[Basic Data Types] --> B[int] A --> C[float] A --> D[double] A --> E[char] B --> B1["Whole numbers<br/>-2B to +2B"] C --> C1["Decimals<br/>6-7 precision"] D --> D1["Precise decimals<br/>15-16 precision"] E --> E1["Single character<br/>'A', '5', '@'"]

🎚️ Data Type Modifiers

Modifiers are like size adjusters — they make pockets bigger, smaller, or change what they accept!

short — Smaller Pocket

Uses less memory but holds smaller numbers.

short small_num = 32000;

Range: about -32,768 to 32,767

long — Bigger Pocket

Holds larger numbers!

long big_num = 2000000000L;
long long huge = 9000000000000LL;

signed vs unsigned

Signed = positive AND negative numbers (default) Unsigned = ONLY positive numbers (but bigger ones!)

signed int temp = -5;    // can be negative
unsigned int age = 25;   // only positive, but bigger max

Think of it like this:

  • Signed: A number line with negatives: -100 ... 0 ... +100
  • Unsigned: Only positive: 0 ... +200
unsigned char brightness = 255;  // 0-255
signed char adjustment = -50;    // -128 to 127

🕳️ The void Data Type

void means “nothing” or “empty”.

When Functions Return Nothing

void sayHello() {
    printf("Hello!\n");
    // no return value needed
}

Generic Pointers

void* is a pointer that can point to ANY type (like a universal adapter).

void* mystery;  // can point to anything!

You cannot create a variable of type void:

// void nothing;  // ERROR! Can't do this!

📏 size_t and ptrdiff_t

These are special types for measuring things in memory.

size_t — For Sizes and Counts

Always positive. Perfect for array sizes and loop counters.

#include <stddef.h>

size_t array_length = 100;
size_t file_size = 1024;

Why use it? It’s guaranteed to be big enough to hold ANY object’s size!

ptrdiff_t — Distance Between Pointers

Can be positive or negative (distance can go both ways).

#include <stddef.h>

int arr[10];
int* start = &arr[0];
int* end = &arr[9];
ptrdiff_t distance = end - start;  // 9

🔢 Fixed Width Integers

Sometimes you need EXACT control over how big your numbers are. These types guarantee the size!

#include <stdint.h>

int8_t tiny = 127;        // exactly 8 bits
int16_t small = 32000;    // exactly 16 bits
int32_t medium = 2000000; // exactly 32 bits
int64_t huge = 9000000000;// exactly 64 bits

// Unsigned versions
uint8_t byte = 255;       // 0 to 255
uint16_t word = 65535;    // 0 to 65535
uint32_t dword = 4000000; // bigger!

When to use them?

  • Writing files that other computers read
  • Hardware programming
  • When you need exact sizes
graph LR A[Fixed Width Integers] --> B[Signed] A --> C[Unsigned] B --> B1["int8_t: -128 to 127"] B --> B2["int16_t: -32K to 32K"] B --> B3["int32_t: -2B to 2B"] B --> B4["int64_t: huge!"] C --> C1["uint8_t: 0-255"] C --> C2["uint16_t: 0-65K"] C --> C3["uint32_t: 0-4B"] C --> C4["uint64_t: huge+"]

✅ Boolean Type (bool)

Booleans are yes/no questions. True or false. On or off.

#include <stdbool.h>

bool isGameOver = false;
bool hasKey = true;

if (hasKey) {
    printf("Door opens!\n");
}

Remember:

  • true = 1 (any non-zero value)
  • false = 0
bool test1 = 1;    // true
bool test2 = 0;    // false
bool test3 = 42;   // also true!

📐 The sizeof Operator

sizeof tells you how many bytes something takes in memory — like measuring how big each pocket really is!

printf("char: %zu bytes\n", sizeof(char));
printf("int: %zu bytes\n", sizeof(int));
printf("float: %zu bytes\n", sizeof(float));
printf("double: %zu bytes\n", sizeof(double));

Typical output:

char: 1 bytes
int: 4 bytes
float: 4 bytes
double: 8 bytes

Using sizeof with Variables

int numbers[10];
size_t total = sizeof(numbers);     // 40 bytes
size_t each = sizeof(numbers[0]);   // 4 bytes
size_t count = total / each;        // 10 elements!

Why Sizes Can Vary

Different computers may have different sizes! That’s why sizeof is so useful — it always tells you the truth for YOUR computer.

graph TD A["sizeof Operator"] --> B["sizeof#40;type#41;"] A --> C["sizeof#40;variable#41;"] A --> D["sizeof#40;expression#41;"] B --> B1["sizeof#40;int#41; → 4"] C --> C1["sizeof#40;myVar#41; → depends"] D --> D1["sizeof#40;arr[0]#41; → element size"]

🎯 Quick Summary

Type Purpose Example
int Whole numbers int age = 25;
float Decimals float price = 9.99;
double Precise decimals double pi = 3.14159;
char Single character char grade = 'A';
void Nothing/empty void doStuff()
bool True/false bool done = true;
size_t Sizes/counts size_t len = 10;
int32_t Exact 32-bit int32_t x = 100;

🌟 You Did It!

You now understand how C stores different types of information — from tiny characters to huge numbers, from whole numbers to precise decimals. Each type is like a perfectly-sized pocket for exactly what you need to store!

Remember: Choose the right type for the job. Don’t use a huge pocket (long long) when a small one (char) will do!

Loading story...

No Story Available

This concept doesn't have a story yet.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

Interactive Preview

Interactive - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Interactive Content

This concept doesn't have interactive content yet.

Cheatsheet Preview

Cheatsheet - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Cheatsheet Available

This concept doesn't have a cheatsheet yet.

Quiz Preview

Quiz - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Quiz Available

This concept doesn't have a quiz yet.