使用&指针声明语法和Intptr。两者都相同吗?

时间:2014-01-22 10:47:44

标签: c#

案例1:

int i;
int* pi = &i;

案例2:

int i;
IntPtr pi = &i;

两种情况都相同吗?

我的目的是: -

  1. 我正在将值复制到字符串变量。
  2. 将字符串转换为字节数组
  3. 使用Marshal.Alloc(sizeofBytesArray)获取IntPtr ptrToArray
  4. marshal.copy(阵列,0,ptrToArray,sizeofBytesArray)
  5. 使用结构并通过SendMessage win32 api传递结构,将此ptrToArray发送到vb6应用程序。
  6. 在VB6应用程序上: -

    1. 我从结构中获取值,该结构为我提供了数组的地址。
    2. 使用CopyMemory将bytesarray数据复制到字符串中..
    3. 更多代码:

      string aString = text;
                  byte[] theBytes = System.Text.Encoding.Default.GetBytes(aString);
      
                  // Marshal the managed struct to a native block of memory.
                  int myStructSize = theBytes.Length;
                  IntPtr pMyStruct = Marshal.AllocHGlobal(myStructSize); //int* or IntPtr is good?
                  try
                  {
                      Marshal.Copy(theBytes, 0, pMyStruct, myStructSize);
      ...............
      

1 个答案:

答案 0 :(得分:1)

根据msdn页面: -

  

IntPtr类型可以由支持指针的语言使用,也可以作为在支持指针和不支持指针的语言之间引用数据的常用方法。

     

IntPtr对象也可用于保存句柄。例如,IntPtr的实例在System.IO.FileStream类中广泛用于保存文件句柄。

这两种情况都是不同的吗?

不,他们不一样, 不同之处在于IntPtr

的基础实现

forex

  int i = 10 ; 
  int *pi = i ; 
  int c = *pi ; // would work 

但要做同样的事情,你必须将IntPtr强制转换为int *

 int i =10 ; 
 IntPtr pi = &i ; 
 int *tempPtr = (int*)pi ; 
 int c = *tempPtr ; 

IntPtr的内部表示与void*类似,但它像整数一样公开。只要您需要存储非托管指针并且不想使用不安全的代码,就可以使用它。

它有两个限制:

  1. 无法直接取消引用(您必须将其转换为真正的指针)。
  2. 它不知道它指向的数据类型。 (因为void*