Mehdi Gholam is right, as far as it goes.
But please, do not use "pointing to" in normal C# - pointers are very different from references and it's not a good area to become confused in!
1) Yes, after the loop,
str
will be a reference to the final string created inside the loop: "01234"
2) No variable in your program will be referencing the "intermediate" string values, except the first one which is a special single instance string that is "shared" across your whole application. So if any other string refers to String.Empty (or "", they are the same thing) there will be a reference to it.
3) No...sort of. There are in fact ways to access the value of the variables on the heap before they are garbage collected (
http://msdn.microsoft.com/en-GB/library/bb383561(v=vs.80).aspx[
^] explains one of them) and even after garbage collection it is possible to access the values if you know how Windows memory management works. For example, a "Brute Force" method is to cause a different program to allocate enough memory to get your entire application data area paged out to disk and then examine the disk content. This is one of the reasons that the SecureString class exists: it's content is encrypted at all times to prevent memory examination from being effective.