小弟对C#一点不懂,一直在用VC6.0写程序。最近想实现个功能,上网载了个C#的,不想太动脑子了,就想把它稍微改一下完成某个功能。
但在C#里面编写程序时遇到了点困难,
在C++中可以使用如下代码:
byte *pByte = NULL;
byte array[100];pByte = array + 10;//这样去直接取第10个值,但这样在C#里面不让编译通过,我就想使用这种方法,不知道哪位高手原意指点一下。谢谢了。

解决方案 »

  1.   

    加上 unsafe ,不安全代码。
      

  2.   

    http://msdn.microsoft.com/zh-cn/library/chfa2zb8.aspx
      

  3.   

    注意:若要编译不安全代码,必须指定 /unsafe 编译器选项。
      

  4.   

    感谢各位那么快就回复,
    还有点小问题。我看了一下2楼朋友们的见面,里面说写函数时加上unsafe,
    unsafe static void SquarePtrParam(int* p)
       {
          *p *= *p;
       }3楼朋友说加 /unsafe编码器选项,这个我不明白在哪里加。
    6.0用惯了,2008真不知道在哪,谢谢了
      

  5.   

    参考:            unsafe
                {
                   
                    byte[] array = new byte[100];
                    for (byte b = 0; b < 100; b++)
                        array[b] = b;
                    fixed (byte* p = &array[0])
                    {
                        byte* pByte = p;
                        pByte += 10;
                        Console.WriteLine(*pByte);
                    }
                }
    劝你不要在C#里面玩指针
      

  6.   

    1、2、3楼好像都是一个朋友/unsafe 编译器选项在VS里就在项目属性中...在命令行调用编译器就是一个参数...虽然可以用不安全代码调用指针,但是强烈不推荐...如非没有替换方案都应该改写成托管代码...
      

  7.   

    http://msdn.microsoft.com/zh-cn/library/ct597kb0.aspxC# 语言参考
    /unsafe(启用不安全模式)(C# 编译器选项)/unsafe 编译器选项允许对使用 unsafe 关键字的代码进行编译。在 Visual Studio 开发环境中设置此编译器选项1. 打开项目的“属性”页。2. 单击“生成”属性页。3. 选中“允许不安全代码”复选框。
      

  8.   

    编译选项是指,你在控制台编译的时候要加unsafe假设你的文件名是test.cs
    那么就在控制台输入
    csc \unsafe test.cs在VS里面可能就直接编译,没试过不安全代码。
      

  9.   

    感谢朋友们,
    再加个小小问题,
    我的类的构造函数是这样定义的。
    public downloadInfo(char[] infos)下面构造对象的时候是这样的:
    char* pChar = p + i * bufferSize;
    downloadInfo dlInfo = new downloadInfo(pChar);编译器的意思就是说这里不能把char *类型的变量赋给char []类型的变量。
    请问这里怎么办?
      

  10.   

    char * 是不能转换为 char[] 的,因为不知道数组的长度是多少。
      

  11.   

    如果知道数组长度,比如为30,那么考虑这样: int len = 30;
    char* pChar = p + i * bufferSize;
    char[] arrayChar = new char[len];
    for (int k = 0; k < len; k++)
    {
    arrayChar[k] = pChar[k];
    }
                    downloadInfo dlInfo = new downloadInfo(arrayChar); 
      

  12.   

    向下面这么申明就可以使用了
    char* pDouble=stackalloc char[50]  //在非托管栈声明 char[]

    char[] arrayChar = new char[50]; 是在托管堆上声明char[]ls的代码 for (int k = 0; k < len; k++)
            {
                arrayChar[k] = pChar[k];
            }
    实际是把托管堆上的对象封送到非托管栈不过就一般意义上而已,如果是unsafe编程,那么实际可以直接用
    char* pDouble=stackalloc char[50] 申明成非托管的char[]
      

  13.   

    http://www.cnblogs.com/Winston/archive/2008/05/26/1207422.html