zoukankan      html  css  js  c++  java
  • 指针类型(C# 编程指南)

    在不安全的上下文中,类型可以是指针类型、值类型或引用类型。 指针类型声明采用下列形式之一:

    C#
    type* identifier;
    void* identifier; //allowed but not recommended
    

    在指针类型中的 * 之前指定的类型被称为“referrent 类型”。 以下任一类型均可为 referrent 类型:

    指针类型不从对象继承,并且指针类型与 object 之间不存在转换。 此外,装箱和取消装箱不支持指针。 但是,你可在不同的指针类型之间以及指针类型和整型之间进行转换。

    在同一个声明中声明多个指针时,星号 (*) 仅与基础类型一起写入;而不是用作每个指针名称的前缀。 例如:

    C#
    int* p1, p2, p3;   // Ok
    int *p1, *p2, *p3;   // Invalid in C#
    

    指针不能指向引用或包含引用的结构,因为无法对对象引用进行垃圾回收,即使有指针指向它也是如此。 垃圾回收器并不跟踪是否有任何类型的指针指向对象。

    myType* 类型的指针变量的值为 myType 类型的变量的地址。 下面是指针类型声明的示例:

    示例描述
    int* p p 是指向整数的指针。
    int** p p 是指向整数的指针的指针。
    int*[] p p 是指向整数的指针的一维数组。
    char* p p 是指向字符的指针。
    void* p p 是指向未知类型的指针。

    指针间接寻址运算符 * 可用于访问位于指针变量所指向的位置的内容。 例如,请考虑以下声明:

    C#
    int* myVariable;
    

    表达式 *myVariable 表示在 int 中包含的地址处找到的 myVariable 变量。

    fixed 语句指针转换主题中有几个指针示例。 下面的示例使用 unsafe 关键字和 fixed语句,并显示如何递增内部指针。 你可将此代码粘贴到控制台应用程序的 Main 函数中来运行它。 这些示例必须使用 -unsafe 编译器选项集进行编译。

    C#
    // Normal pointer to an object.
    int[] a = new int[5] { 10, 20, 30, 40, 50 };
    // Must be in unsafe code to use interior pointers.
    unsafe
    {
        // Must pin object on heap so that it doesn't move while using interior pointers.
        fixed (int* p = &a[0])
        {
            // p is pinned as well as object, so create another pointer to show incrementing it.
            int* p2 = p;
            Console.WriteLine(*p2);
            // Incrementing p2 bumps the pointer by four bytes due to its type ...
            p2 += 1;
            Console.WriteLine(*p2);
            p2 += 1;
            Console.WriteLine(*p2);
            Console.WriteLine("--------");
            Console.WriteLine(*p);
            // Deferencing p and incrementing changes the value of a[0] ...
            *p += 1;
            Console.WriteLine(*p);
            *p += 1;
            Console.WriteLine(*p);
        }
    }
    
    Console.WriteLine("--------");
    Console.WriteLine(a[0]);
    
    // Output:
    //10
    //20
    //30
    //--------
    //10
    //11
    //12
    //--------
    //12
    

    你无法对 void* 类型的指针应用间接寻址运算符。 但是,你可以使用强制转换将 void 指针转换为任何其他指针类型,反之亦然。

    指针可以为 null。 将间接寻址运算符应用于 null 指针将导致由实现定义的行为。

    在方法之间传递指针会导致未定义的行为。 考虑这种方法,该方法通过 inout 或 ref 参数或作为函数结果返回一个指向局部变量的指针。 如果已在固定块中设置指针,则它指向的变量不再是固定的。

    下表列出了可在不安全的上下文中对指针执行的运算符和语句:

    运算符/语句使用
    * 执行指针间接寻址。
    -> 通过指针访问结构的成员。
    [] 为指针建立索引。
    & 获取变量的地址。
    ++ 和 -- 递增和递减指针。
    + 和 - 执行指针算法。
    ==、!=、<、>、<= 和 >= 比较指针。
    stackalloc 在堆栈上分配内存。
    fixed 语句 临时固定变量以便找到其地址。

    C# 语言规范

    有关详细信息,请参阅 C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。

    请参阅

    C# 编程指南
    不安全代码和指针
    指针转换
    指针表达式
    类型
    unsafe
    fixed 语句
    stackalloc
    装箱和取消装箱

  • 相关阅读:
    Java输出文件到本地(输出流)
    Java 工厂设计模式
    实际工作与JAVA面试题
    JAVA 转义字符串中的特殊字符
    Oracle工作笔记
    JS验证表单中TEXT文本框中是否含有非法字符
    JAVA 解析TXT文本
    表单异步提交数据
    rem.js(2)
    rem.js(1)
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/9049602.html
Copyright © 2011-2022 走看看