title: Why doesn't IntPtr need the unsafe keyword?
body: <p>When you use a pointer like <code>int*</code> in C#, you need to use the <code>unsafe</code> keyword, but when you use an <code>IntPtr</code>, you don't. What is the difference of these? They both can point to an address.</p>
  
  <p>How does the garbage collector deal with these two types? Are they dealt with differently? If so, what is the difference? If not, why one needs the <code>unsafe</code> keyword?</p>
  
  <p><strong>Edit:</strong> Thanks a lot for everyone's answers so far, but what I would like to know is how they are handled differently by the framework and the garbage collector, rather than the MSDN definition of <code>IntPtr</code>. It only takes one Google search to go there. What I'd like to know why IntPtr does not need the <code>unsafe</code> keyword? I would like to grasp the reason why we can use it without the keyword.</p>