Skip to content
LAM
Read Home Blog
Make Projects HTML Tools Games
Touch grass Notes Resume Links
Home Blog HTML Projects
Tools Games Notes Resume Links
Back Pointers: The Complete Guide Programming
Download Open
Show description 2,315 chars · Programming

Pointers: The Complete Guide

Pointers: The Complete Guide





POINTERS

Master the Art of Memory Management

Begin Tutorial







What Are Pointers?



Memory Location

Every variable in your program has a specific location in memory, identified by a unique address.




Pointer Variable

A pointer is a special variable that stores the memory address of another variable.




Indirect Access

Pointers allow you to access and modify data indirectly through memory addresses.












Box and Arrow Notation


Visual representation helps understand pointer relationships





var1

5



→


var2

1104







int var1 = 5;
int *var2 = &var1;

// var1 contains the value 5
// var2 contains the address of var1









Memory Layout Visualization


Main Memory



1104:

5

← var1




1108:

...




1120:

1104

← var2














C Notation: & and * Operators




& (Reference Operator)

Returns the address of a variable. If y = &x, then &x is called an "r-value".


int x = 42;
int *ptr = &x; // Get address of x






* (Dereference Operator)

Returns the value at the address stored by a pointer. If *y = 5, then *y is called an "l-value".


int value = *ptr; // Get value at address
*ptr = 100; // Modify value at address








Key Concepts:


🔸 r-value: Pure value that can occur on the right of an assignment

🔸 l-value: Variable that can occur on left and right of an assignment

🔸 Complementary: * and & operations cancel each other out






// They are complementary operations:
*(&p) → p // Pointer to address converts back to p
&(*p) → p // Address to variable content converts back to p









Library Collections Analogy


Understanding Variables Through a Library System




📚 Value (Book)

The actual data stored in the variable - like a book on the shelf.




📍 Location (Bookshelf)

The physical place in memory where the value is stored.




🏷️ Address (Floor + Shelf + Position)

The specific numerical address used to locate the memory position.




📋 Name (Book Title)

The variable name we use in code - not all memory locations have names.







🔖 Pointer = Catalog Entry

A pointer is like a catalog card that tells you where to find a specific book.…

Pointers: The Complete Guide

29,161 bytes · HTML source
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Pointers: The Complete Guide</title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&display=swap');
        
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        :root {
            --bg-primary: #0a0a0a;
            --bg-secondary: #1a1a1a;
            --accent-green: #00ff41;
            --accent-cyan: #00ffff;
            --accent-magenta: #ff00ff;
            --accent-yellow: #ffff00;
            --text-primary: #ffffff;
            --text-secondary: #cccccc;
            --border-color: #333333;
        }
        
        body {
            font-family: 'Orbitron', monospace;
            background: var(--bg-primary);
            color: var(--text-primary);
            line-height: 1.6;
            overflow-x: hidden;
        }
        
        /* Retro grid background */
        body::before {
            content: '';
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-image: 
                linear-gradient(var(--accent-green) 1px, transparent 1px),
                linear-gradient(90deg, var(--accent-green) 1px, transparent 1px);
            background-size: 50px 50px;
            opacity: 0.03;
            pointer-events: none;
            z-index: -1;
        }
        
        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 0 20px;
        }
        
        /* Header */
        header {
            background: linear-gradient(135deg, var(--bg-secondary), var(--bg-primary));
            padding: 60px 0;
            text-align: center;
            position: relative;
            overflow: hidden;
        }
        
        header::before {
            content: '';
            position: absolute;
            top: -50%;
            left: -50%;
            width: 200%;
            height: 200%;
            background: radial-gradient(circle, var(--accent-cyan) 0%, transparent 70%);
            opacity: 0.1;
            animation: rotate 20s linear infinite;
        }
        
        @keyframes rotate {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
        
        h1 {
            font-size: 4em;
            font-weight: 900;
            color: var(--accent-green);
            text-shadow: 
                0 0 10px var(--accent-green),
                0 0 20px var(--accent-green),
                0 0 30px var(--accent-green);
            margin-bottom: 20px;
            position: relative;
            z-index: 1;
        }
        
        .subtitle {
            font-size: 1.5em;
            color: var(--accent-cyan);
            margin-bottom: 30px;
            position: relative;
            z-index: 1;
        }
        
        .pixel-btn {
            display: inline-block;
            padding: 15px 30px;
            background: var(--accent-magenta);
            color: var(--bg-primary);
            text-decoration: none;
            font-weight: 700;
            text-transform: uppercase;
            border: none;
            cursor: pointer;
            position: relative;
            transition: all 0.3s ease;
            box-shadow: 
                0 0 0 2px var(--accent-magenta),
                0 0 0 4px var(--bg-primary),
                0 0 0 6px var(--accent-magenta);
        }
        
        .pixel-btn:hover {
            transform: translateY(-3px);
            box-shadow: 
                0 0 0 2px var(--accent-magenta),
                0 0 0 4px var(--bg-primary),
                0 0 0 6px var(--accent-magenta),
                0 10px 20px rgba(255, 0, 255, 0.3);
        }
        
        /* Section styling */
        section {
            padding: 80px 0;
            position: relative;
        }
        
        .section-title {
            font-size: 2.5em;
            color: var(--accent-yellow);
            text-align: center;
            margin-bottom: 50px;
            text-shadow: 0 0 10px var(--accent-yellow);
        }
        
        /* Code blocks */
        .code-block {
            background: var(--bg-secondary);
            border: 2px solid var(--accent-green);
            border-radius: 0;
            padding: 25px;
            font-family: 'Courier New', monospace;
            margin: 20px 0;
            position: relative;
            overflow-x: auto;
            box-shadow: 
                0 0 0 4px var(--bg-primary),
                0 0 0 6px var(--accent-green),
                0 10px 30px rgba(0, 255, 65, 0.2);
        }
        
        .code-block::before {
            content: '> CODE';
            position: absolute;
            top: -15px;
            left: 20px;
            background: var(--accent-green);
            color: var(--bg-primary);
            padding: 5px 15px;
            font-size: 0.8em;
            font-weight: 700;
        }
        
        /* Memory visualization */
        .memory-viz {
            display: flex;
            justify-content: center;
            align-items: center;
            margin: 40px 0;
            flex-wrap: wrap;
            gap: 30px;
        }
        
        .memory-box {
            background: var(--bg-secondary);
            border: 3px solid var(--accent-cyan);
            padding: 20px;
            min-width: 100px;
            text-align: center;
            position: relative;
            animation: pulse 2s infinite;
        }
        
        @keyframes pulse {
            0% { box-shadow: 0 0 5px var(--accent-cyan); }
            50% { box-shadow: 0 0 20px var(--accent-cyan), 0 0 30px var(--accent-cyan); }
            100% { box-shadow: 0 0 5px var(--accent-cyan); }
        }
        
        .memory-address {
            font-size: 0.8em;
            color: var(--accent-yellow);
            position: absolute;
            top: -25px;
            left: 50%;
            transform: translateX(-50%);
        }
        
        .memory-value {
            font-size: 1.5em;
            color: var(--text-primary);
            font-weight: 700;
        }
        
        .arrow {
            font-size: 3em;
            color: var(--accent-magenta);
            animation: bounce 1s infinite;
        }
        
        @keyframes bounce {
            0%, 100% { transform: translateX(0); }
            50% { transform: translateX(10px); }
        }
        
        /* Concept boxes */
        .concept-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 30px;
            margin: 40px 0;
        }
        
        .concept-card {
            background: var(--bg-secondary);
            border: 2px solid var(--accent-cyan);
            padding: 30px;
            position: relative;
            transition: all 0.3s ease;
        }
        
        .concept-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 15px 30px rgba(0, 255, 255, 0.3);
        }
        
        .concept-card h3 {
            color: var(--accent-yellow);
            font-size: 1.3em;
            margin-bottom: 15px;
        }
        
        /* Interactive demo */
        .interactive-demo {
            background: var(--bg-secondary);
            border: 3px solid var(--accent-magenta);
            padding: 30px;
            margin: 40px 0;
            text-align: center;
        }
        
        .demo-controls {
            margin: 20px 0;
        }
        
        .demo-btn {
            background: var(--accent-green);
            color: var(--bg-primary);
            border: none;
            padding: 10px 20px;
            margin: 0 10px;
            font-family: 'Orbitron', monospace;
            font-weight: 700;
            cursor: pointer;
            transition: all 0.3s ease;
        }
        
        .demo-btn:hover {
            background: var(--accent-yellow);
            transform: scale(1.05);
        }
        
        /* Scrolling animations */
        .fade-in {
            opacity: 0;
            transform: translateY(30px);
            transition: all 0.6s ease;
        }
        
        .fade-in.visible {
            opacity: 1;
            transform: translateY(0);
        }
        
        /* Responsive */
        @media (max-width: 768px) {
            h1 { font-size: 2.5em; }
            .section-title { font-size: 2em; }
            .memory-viz { flex-direction: column; }
        }
        
        /* Syntax highlighting */
        .keyword { color: var(--accent-magenta); }
        .type { color: var(--accent-cyan); }
        .operator { color: var(--accent-yellow); }
        .number { color: var(--accent-green); }
        .comment { color: #666; font-style: italic; }
    </style>
</head>
<body>
    <header>
        <div class="container">
            <h1>POINTERS</h1>
            <p class="subtitle">Master the Art of Memory Management</p>
            <a href="#start" class="pixel-btn">Begin Tutorial</a>
        </div>
    </header>

    <section id="start">
        <div class="container">
            <h2 class="section-title">What Are Pointers?</h2>
            <div class="concept-grid">
                <div class="concept-card fade-in">
                    <h3>Memory Location</h3>
                    <p>Every variable in your program has a specific location in memory, identified by a unique address.</p>
                </div>
                <div class="concept-card fade-in">
                    <h3>Pointer Variable</h3>
                    <p>A pointer is a special variable that stores the memory address of another variable.</p>
                </div>
                <div class="concept-card fade-in">
                    <h3>Indirect Access</h3>
                    <p>Pointers allow you to access and modify data indirectly through memory addresses.</p>
                </div>
            </div>
        </div>
    </section>

    <section>
        <div class="container">
            <h2 class="section-title">Box and Arrow Notation</h2>
            <p style="text-align: center; font-size: 1.2em; margin-bottom: 40px;">
                Visual representation helps understand pointer relationships
            </p>
            
            <div class="memory-viz">
                <div class="memory-box">
                    <div class="memory-address">var1</div>
                    <div class="memory-value">5</div>
                </div>
                <div class="arrow">→</div>
                <div class="memory-box">
                    <div class="memory-address">var2</div>
                    <div class="memory-value">1104</div>
                </div>
            </div>

            <div class="code-block">
<span class="type">int</span> var1 = <span class="number">5</span>;
<span class="type">int</span> *var2 = &var1;

<span class="comment">// var1 contains the value 5</span>
<span class="comment">// var2 contains the address of var1</span>
            </div>
        </div>
    </section>

    <section>
        <div class="container">
            <h2 class="section-title">Memory Layout Visualization</h2>
            <div style="background: var(--bg-secondary); padding: 30px; border: 2px solid var(--accent-green); margin: 20px 0;">
                <h3 style="color: var(--accent-yellow); text-align: center; margin-bottom: 30px;">Main Memory</h3>
                <div style="display: flex; flex-direction: column; align-items: center; gap: 10px;">
                    <div style="display: flex; align-items: center; width: 100%; max-width: 400px;">
                        <div style="width: 80px; text-align: right; margin-right: 20px; color: var(--accent-yellow);">1104:</div>
                        <div style="border: 2px solid var(--accent-cyan); padding: 10px 20px; background: var(--bg-primary); flex: 1; text-align: center;">5</div>
                        <div style="margin-left: 20px; color: var(--accent-green);">← var1</div>
                    </div>
                    <div style="display: flex; align-items: center; width: 100%; max-width: 400px;">
                        <div style="width: 80px; text-align: right; margin-right: 20px; color: var(--accent-yellow);">1108:</div>
                        <div style="border: 2px solid var(--border-color); padding: 10px 20px; background: var(--bg-primary); flex: 1; text-align: center;">...</div>
                    </div>
                    <div style="display: flex; align-items: center; width: 100%; max-width: 400px;">
                        <div style="width: 80px; text-align: right; margin-right: 20px; color: var(--accent-yellow);">1120:</div>
                        <div style="border: 2px solid var(--accent-magenta); padding: 10px 20px; background: var(--bg-primary); flex: 1; text-align: center;">1104</div>
                        <div style="margin-left: 20px; color: var(--accent-green);">← var2</div>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <section>
        <div class="container">
            <h2 class="section-title">C Notation: & and * Operators</h2>
            
            <div class="concept-grid">
                <div class="concept-card fade-in">
                    <h3>& (Reference Operator)</h3>
                    <p>Returns the address of a variable. If <code style="color: var(--accent-green);">y = &x</code>, then <code style="color: var(--accent-green);">&x</code> is called an "r-value".</p>
                    <div class="code-block">
<span class="type">int</span> x = <span class="number">42</span>;
<span class="type">int</span> *ptr = <span class="operator">&</span>x;  <span class="comment">// Get address of x</span>
                    </div>
                </div>
                
                <div class="concept-card fade-in">
                    <h3>* (Dereference Operator)</h3>
                    <p>Returns the value at the address stored by a pointer. If <code style="color: var(--accent-green);">*y = 5</code>, then <code style="color: var(--accent-green);">*y</code> is called an "l-value".</p>
                    <div class="code-block">
<span class="type">int</span> value = <span class="operator">*</span>ptr;  <span class="comment">// Get value at address</span>
<span class="operator">*</span>ptr = <span class="number">100</span>;       <span class="comment">// Modify value at address</span>
                    </div>
                </div>
            </div>

            <div style="background: var(--bg-secondary); padding: 25px; border-left: 5px solid var(--accent-yellow); margin: 30px 0;">
                <h3 style="color: var(--accent-yellow); margin-bottom: 15px;">Key Concepts:</h3>
                <ul style="list-style: none; padding-left: 0;">
                    <li style="margin: 10px 0;">🔸 <strong>r-value:</strong> Pure value that can occur on the right of an assignment</li>
                    <li style="margin: 10px 0;">🔸 <strong>l-value:</strong> Variable that can occur on left and right of an assignment</li>
                    <li style="margin: 10px 0;">🔸 <strong>Complementary:</strong> * and & operations cancel each other out</li>
                </ul>
            </div>

            <div class="code-block">
<span class="comment">// They are complementary operations:</span>
<span class="operator">*</span>(<span class="operator">&</span>p) → p    <span class="comment">// Pointer to address converts back to p</span>
<span class="operator">&</span>(<span class="operator">*</span>p) → p    <span class="comment">// Address to variable content converts back to p</span>
            </div>
        </div>
    </section>

    <section>
        <div class="container">
            <h2 class="section-title">Library Collections Analogy</h2>
            <div style="background: linear-gradient(135deg, var(--bg-secondary), var(--bg-primary)); padding: 40px; border: 2px solid var(--accent-cyan); margin: 30px 0;">
                <h3 style="color: var(--accent-yellow); text-align: center; margin-bottom: 30px;">Understanding Variables Through a Library System</h3>
                
                <div class="concept-grid">
                    <div class="concept-card">
                        <h3>📚 Value (Book)</h3>
                        <p>The actual data stored in the variable - like a book on the shelf.</p>
                    </div>
                    <div class="concept-card">
                        <h3>📍 Location (Bookshelf)</h3>
                        <p>The physical place in memory where the value is stored.</p>
                    </div>
                    <div class="concept-card">
                        <h3>🏷️ Address (Floor + Shelf + Position)</h3>
                        <p>The specific numerical address used to locate the memory position.</p>
                    </div>
                    <div class="concept-card">
                        <h3>📋 Name (Book Title)</h3>
                        <p>The variable name we use in code - not all memory locations have names.</p>
                    </div>
                </div>

                <div style="margin-top: 40px; padding: 25px; background: var(--bg-primary); border: 2px solid var(--accent-green);">
                    <h4 style="color: var(--accent-green); margin-bottom: 15px;">🔖 Pointer = Catalog Entry</h4>
                    <p>A pointer is like a catalog card that tells you where to find a specific book. The catalog card itself has:</p>
                    <ul style="margin-top: 15px; padding-left: 20px;">
                        <li><strong>Value:</strong> The book's location address</li>
                        <li><strong>Location:</strong> Where the catalog card is stored</li>
                        <li><strong>Address:</strong> The catalog card's index number</li>
                        <li><strong>Name:</strong> The catalog entry identifier</li>
                    </ul>
                </div>
            </div>
        </div>
    </section>

    <section>
        <div class="container">
            <h2 class="section-title">Interactive Demo</h2>
            <div class="interactive-demo">
                <h3 style="color: var(--accent-yellow); margin-bottom: 20px;">Pointer Operations Simulator</h3>
                <div id="demo-display" style="background: var(--bg-primary); padding: 30px; margin: 20px 0; border: 2px solid var(--accent-green);">
                    <div id="variable-display"></div>
                    <div id="pointer-display"></div>
                </div>
                <div class="demo-controls">
                    <button class="demo-btn" onclick="createVariable()">Create Variable</button>
                    <button class="demo-btn" onclick="createPointer()">Create Pointer</button>
                    <button class="demo-btn" onclick="dereferencePointer()">Dereference (*)</button>
                    <button class="demo-btn" onclick="resetDemo()">Reset</button>
                </div>
            </div>
        </div>
    </section>

    <section>
        <div class="container">
            <h2 class="section-title">Complete Code Examples</h2>
            
            <div class="code-block">
<span class="comment">// Basic pointer declaration and initialization</span>
<span class="type">int</span> num = <span class="number">42</span>;
<span class="type">int</span> *ptr = <span class="operator">&</span>num;

printf(<span style="color: var(--accent-green);">"Value of num: %d\n"</span>, num);           <span class="comment">// 42</span>
printf(<span style="color: var(--accent-green);">"Address of num: %p\n"</span>, <span class="operator">&</span>num);        <span class="comment">// e.g., 0x7fff5fbff6ac</span>
printf(<span style="color: var(--accent-green);">"Value of ptr: %p\n"</span>, ptr);          <span class="comment">// Same as &num</span>
printf(<span style="color: var(--accent-green);">"Value at ptr: %d\n"</span>, <span class="operator">*</span>ptr);         <span class="comment">// 42</span>
            </div>

            <div class="code-block">
<span class="comment">// Modifying values through pointers</span>
<span class="type">int</span> x = <span class="number">10</span>;
<span class="type">int</span> *p = <span class="operator">&</span>x;

printf(<span style="color: var(--accent-green);">"Before: x = %d\n"</span>, x);  <span class="comment">// 10</span>

<span class="operator">*</span>p = <span class="number">20</span>;  <span class="comment">// Modify x through pointer</span>

printf(<span style="color: var(--accent-green);">"After: x = %d\n"</span>, x);   <span class="comment">// 20</span>
            </div>

            <div class="code-block">
<span class="comment">// Pointer arithmetic and arrays</span>
<span class="type">int</span> arr[] = {<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>};
<span class="type">int</span> *ptr = arr;  <span class="comment">// Points to first element</span>

<span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i < <span class="number">5</span>; i++) {
    printf(<span style="color: var(--accent-green);">"arr[%d] = %d, *(ptr+%d) = %d\n"</span>, 
           i, arr[i], i, <span class="operator">*</span>(ptr + i));
}
            </div>
        </div>
    </section>

    <section>
        <div class="container">
            <h2 class="section-title">Key Takeaways</h2>
            <div class="concept-grid">
                <div class="concept-card fade-in">
                    <h3>🎯 Memory Management</h3>
                    <p>Pointers give you direct control over memory, enabling efficient data manipulation and dynamic memory allocation.</p>
                </div>
                <div class="concept-card fade-in">
                    <h3>🔄 Indirection</h3>
                    <p>Pointers provide a level of indirection, allowing functions to modify variables and work with large data structures efficiently.</p>
                </div>
                <div class="concept-card fade-in">
                    <h3>⚡ Performance</h3>
                    <p>Using pointers can significantly improve performance by avoiding unnecessary data copying and enabling direct memory access.</p>
                </div>
                <div class="concept-card fade-in">
                    <h3>🏗️ Data Structures</h3>
                    <p>Pointers are fundamental for building complex data structures like linked lists, trees, and graphs.</p>
                </div>
            </div>
        </div>
    </section>

    <footer style="background: var(--bg-secondary); padding: 50px 0; text-align: center; border-top: 2px solid var(--accent-green);">
        <div class="container">
            <h2 style="color: var(--accent-green); margin-bottom: 20px;">Mission Complete!</h2>
            <p style="font-size: 1.2em; margin-bottom: 30px;">You've mastered the fundamentals of pointers in C</p>
            <div style="color: var(--accent-cyan);">
                <p>Continue your journey: Practice with real projects and explore advanced pointer concepts</p>
            </div>
        </div>
    </footer>

    <script>
        // Scroll animations
        const observerOptions = {
            threshold: 0.1,
            rootMargin: '0px 0px -50px 0px'
        };

        const observer = new IntersectionObserver((entries) => {
            entries.forEach(entry => {
                if (entry.isIntersecting) {
                    entry.target.classList.add('visible');
                }
            });
        }, observerOptions);

        document.querySelectorAll('.fade-in').forEach(el => {
            observer.observe(el);
        });

        // Interactive demo
        let demoState = {
            variable: null,
            pointer: null
        };

        function createVariable() {
            demoState.variable = {
                name: 'int x',
                value: 42,
                address: '0x1104'
            };
            updateDemo();
        }

        function createPointer() {
            if (!demoState.variable) {
                alert('Create a variable first!');
                return;
            }
            demoState.pointer = {
                name: 'int *ptr',
                value: demoState.variable.address,
                address: '0x1120'
            };
            updateDemo();
        }

        function dereferencePointer() {
            if (!demoState.pointer) {
                alert('Create a pointer first!');
                return;
            }
            const result = `*ptr = ${demoState.variable.value}`;
            document.getElementById('pointer-display').innerHTML += 
                `<div style="color: var(--accent-yellow); margin-top: 10px; font-weight: bold;">${result}</div>`;
        }

        function resetDemo() {
            demoState = { variable: null, pointer: null };
            updateDemo();
        }

        function updateDemo() {
            const varDisplay = document.getElementById('variable-display');
            const ptrDisplay = document.getElementById('pointer-display');
            
            if (demoState.variable) {
                varDisplay.innerHTML = `
                    <div style="color: var(--accent-green); margin-bottom: 10px;">
                        <strong>${demoState.variable.name} = ${demoState.variable.value}</strong><br>
                        Address: ${demoState.variable.address}
                    </div>
                `;
            } else {
                varDisplay.innerHTML = '<div style="color: var(--text-secondary);">No variable created</div>';
            }
            
            if (demoState.pointer) {
                ptrDisplay.innerHTML = `
                    <div style="color: var(--accent-cyan); margin-top: 20px;">
                        <strong>${demoState.pointer.name} = ${demoState.pointer.value}</strong><br>
                        Address: ${demoState.pointer.address}<br>
                        Points to: ${demoState.variable.name}
                    </div>
                `;
            } else {
                ptrDisplay.innerHTML = '<div style="color: var(--text-secondary);">No pointer created</div>';
            }
        }

        // Initialize demo
        updateDemo();

        // Smooth scrolling for anchor links
        document.querySelectorAll('a[href^="#"]').forEach(anchor => {
            anchor.addEventListener('click', function (e) {
                e.preventDefault();
                const target = document.querySelector(this.getAttribute('href'));
                if (target) {
                    target.scrollIntoView({
                        behavior: 'smooth',
                        block: 'start'
                    });
                }
            });
        });

        // Add some interactive effects
        document.querySelectorAll('.memory-box').forEach(box => {
            box.addEventListener('mouseenter', function() {
                this.style.transform = 'scale(1.05)';
                this.style.transition = 'all 0.3s ease';
            });
            
            box.addEventListener('mouseleave', function() {
                this.style.transform = 'scale(1)';
            });
        });

        // Console easter egg
        console.log('%c🎮 Welcome to the Pointer Tutorial! 🎮', 'color: #00ff41; font-size: 20px; font-weight: bold;');
        console.log('%cYou found the secret developer console!', 'color: #00ffff; font-size: 14px;');
        console.log('%cTry typing: showMemoryMap()', 'color: #ffff00; font-size: 12px;');

        window.showMemoryMap = function() {
            console.log('%c📋 MEMORY MAP 📋', 'color: #ff00ff; font-size: 16px; font-weight: bold;');
            console.log('Address  | Value | Variable');
            console.log('---------|-------|----------');
            console.log('0x1104   |   42  | int x');
            console.log('0x1120   | 0x1104| int *ptr');
        };
    </script>
</body>
</html>