zoukankan      html  css  js  c++  java
  • 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] != '';        //字符串结束符号是 ''
                             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();
            }
        }
    }
    输出结果:

  • 相关阅读:
    Flink -- Java Generics Programming
    SpringBoot-annotation
    RDMA in CloudComputing
    ARM-IoT
    Netty
    TiDB, Distributed Database
    microkernel architecture
    Web网站的几个并发量级
    vtiger 下载地址
    php分布式缓存系统 Memcached 入门
  • 原文地址:https://www.cnblogs.com/mingxuantongxue/p/3862746.html
Copyright © 2011-2022 走看看