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
    装箱和取消装箱

  • 相关阅读:
    [译文] 实体与值对象到底是不是一回事?
    实现 WebApi 自托管服务宿主于 WinForms 及其交互
    [译文] C# 8 已成旧闻, 向前, 抵达 C# 9!
    [译文] 为什么你在 C# 里总是应该使用 "var" 关键字
    通过设置iis在局域网中访问网页
    windows 10 安装使用kafka
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端
    Asp.net Core 2.0 OpenId Connect Handler缺失Claims?
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/9049602.html
Copyright © 2011-2022 走看看