 <p>I believe there are three different concepts: initializing the variable, the location of the variable in memory, the time the variable is initialized.</p> <h1>First: Initialization</h1> <p>When a variable is allocated in memory, typical processors leave the memory untouched, so the variable will have the same value that somebody else stored earlier. For security, some compilers add the extra code to initialize all variables they allocate to zero. I think this is what you mean by "Zero Initialization". It happens when you say:</p> <pre><code> int i; // not all compilers set this to zero </code></pre> <p>However if you say to the compiler:</p> <pre><code> int i = 10; </code></pre> <p>then the compiler instructs the processor to put 10 in the memory rather than leaving it with old values or setting it to zero. I think this is what you mean by "Static Initialization".</p> <p>Finally, you could say this:</p> <pre><code> int i; ... ... i = 11; </code></pre> <p>then the processor "zero initializes" (or leaves the old value) when executing <code>int i;</code> then when it reaches the line <code>i = 11</code> it "dynamically initializes" the variable to 11 (which can happen very long after the first initialization.</p> <h1>Second: Location of the variable</h1> <p>There are: stack-based variables (sometimes called static variables), and memory-heap variables (sometimes called dynamic variables).</p> <p>Variables can be created in the stack segment using this:</p> <pre><code>int i; </code></pre> <p>or the memory heap like this:</p> <pre><code>int *i = new int; </code></pre> <p>The difference is that the stack segment variable is lost after exiting the function call, while memory-heap variables are left until you say <code>delete i;</code>. You can read an Assembly-language book to understand the difference better.</p> <h1>Third: The time the variable is initialized</h1> <p>A stack-segment variable is "zero-initialized" or statically-initialized" when you enter the function call they are defined within.</p> <p>A memory-heap variable is "zero-initialized" or statically-initialized" when it is first created by the <code>new</code> operator.</p> <h1>Final Remark</h1> <p>You can think about <code>static int i;</code> as a global variable with a scope limited to the function it is defined in. I think the confusion about <code>static int i;</code> comes because static hear mean another thing (it is not destroyed when you exit the routine, so it retains its value). I am not sure, but I think the trick used for <code>static int i;</code> is to put it in the stack of <code>main()</code> which means it is not destroyed until you exit the whole program (so it retains the first initialization), or it could be that it is stored in the data segment of the application.</p>