首页 > 代码库 > C# 指针_铭轩同学原创

C# 指针_铭轩同学原创

using System;using System.Collections.Generic;using System.Text;namespace HelloWorld{    class Program    {        static void Main(string[] args)        {            // 1.指针的定义            //      1.1指针是专门处理地址的数据类型            //      1.2指针是某个内存单元的首地址            // 2.C#指针的和C,C++的区别(这里我们需要知道两个关键字 unsafe 和 fixed)            //      2.1指针在c#中是不提倡使用的,有关指针的操作被认为是不安全的(unsafe)。因此运行这段代码之前,先要改一个地方,否则编译不过无法运行。            //         修改方法:            //                  在右侧的solution Explorer中找到你的项目,在项目图标(绿色)上点右键,选最后一项properties,然后在Build标签页里把Allow unsafe code勾选上。之后这段代码就可以运行了,你会看到,上面这段代码可以像C语言那样用指针操纵数组。但前提是必须有fixed (int* p = array),它的意思是让p固定指向数组array,不允许改动。因为C#的自动垃圾回收机制会允许已经分配的内存在运行时进行位置调整,如果那样,p可能一开始指的是array,但后来array的位置被调整到别的位置后,p指向的就不是array了。所以要加一个fixed关键字,把它定在那里一动不动,之后的操作才有保障。            //**********************下面直接看代码:*********************            //1.1 int类型指针(值类型)            //C#操作指针的时候必须放在unsafe代码块下            unsafe            {                //声明一个int变量 值为10;                int i = 10;                //声明一个指针变量                int* intp;                //将指针指向变量i                intp = &i;                Console.WriteLine("变量I的值为:{0}", i);                Console.WriteLine("变量I的内存地址为:{0:X}", (int)intp);                Console.WriteLine("指针intp的内存地址为:{0:X}", (int)&intp);                Console.WriteLine("指针intp的值为:{0}", *intp);            }            //1.2 string类型(引用类型)            unsafe            {                //声明一个字符串为 hello world!(string类型就是一个char的数组)                string _str = "hello world!";                //上文已经说过,C#中因为有gc的原因会把放在托管椎中的内存进行位置调整fixed的作用就是让其固定.                fixed (char* strp = _str)                {                    Console.WriteLine("变量_str的值为:{0}", _str);                    Console.WriteLine("变量_str的地址为:{0}", (int)strp);                    Console.WriteLine("指针strp的值为{0}", *strp);                    //提示错误, 无法取得只读局部变量的地址 , 因为strp是只读的.编译器不让strp改变改指针.所以编译不通过                    //Console.WriteLine("指针strp的地址为:{0}", (int)&strp);                    //循环输出字符串                    char* chp = strp;                    for (int i = 0;                         chp[i] != \0;        //字符串结束符号是 ‘\0‘                         i++)                    {                        Console.Write(chp[i]);                    }                    Console.WriteLine();                    Console.WriteLine("指针strp的地址:{0:x}", (int)chp);                    Console.WriteLine("指针chp的地址:{0:x}", (int)&chp);                }            }            //1.3数组            unsafe            {                //声明一个数组                int[] arrInt = { 1, 2, 3, 4, 5, 6, 7, 87, 8 };                fixed (int* ip = arrInt)                {                    //循环输出数组                    int* p = ip;                    for (int i = 0; i < arrInt.Length; i++)                    {                        Console.Write(p[i] + " ");                    }                }            }            Console.ReadKey();        }    }}
输出结果: