原文地址:https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx

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

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

以下任一类型均可为指针类型:

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

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

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

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

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

示例

说明

int* p

p 是指向整数的指针。

int** p

p 是指向整数的指针的指针。

int*[] p

p 是指向整数的指针的一维数组。

char* p

p 是指向字符的指针。

void* p

p 是指向未知类型的指针。

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

 
 
int* myVariable;

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

主题fixed 语句(C# 参考)指针转换(C# 编程指南)包含了多个指针示例。下面的示例显示需要 unsafe 关键字和 fixed 语句以及如何递增内部指针。你可将此代码粘贴到控制台应用程序的 Main 函数中来运行它。(记住在“项目设计器”中启用不安全代码;选择菜单栏上的“项目”“属性”,然后选择“生成”选项卡中的“允许不安全代码”。)

 
 
// 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]);
Console.ReadLine(); // Output:
//10
//20
//30
//--------
//10
//11
//12
//--------
//12

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

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

请注意,在方法之间传递指针会导致未定义的行为。 示例通过 Out 或 Ref 参数或作为函数结果返回一个指向局部变量的指针。 如果已在固定块中设置指针,则它指向的变量不再是固定的。

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

运算符/语句

用法

*

执行指针间接寻址。

->

通过指针访问结构的成员。

[]

为指针建立索引。

&

获取变量的地址。

++ 和 --

递增和递减指针。

+ 和 -

执行指针算法。

==、!=、<、>、<= 和 >=

比较指针。

stackalloc

在堆栈上分配内存。

fixed 语句

临时固定变量以便找到其地址。

指针类型(C# 编程指南)的更多相关文章

  1. Core Animation编程指南

    本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原 ...

  2. 匿名类型(C# 编程指南)

    匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 类型名由编译器生成,并且不能在源代码级使用.  每个属性的类型由编译器推断. 可通过使用 new 运算 ...

  3. 3、二、c# 面向对像编程。类,结构、C# 数据类型(引用类型、值 类型、指针类型)、ref参数与out参数、方法的重载、静态类型与静态成员、继承与多态、委托与事件

    一.类 定义类使用class关键字. <access specifier> class class_name { // member variables 成员变量 <access s ...

  4. 编程范式 epesode7,8 stack存放指针类型and heap,register

    这一节从后往前写. ____stack and heap ___stack由 汇编语言操控管理,数据先入后出. 栈是存放局部变量,函数调用子函数时,该函数在栈中占用的空间会增大,用于存放子函数的局部变 ...

  5. 指针转换(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/etb4xxec.aspx 下表显示了预定义的隐式指针转换.隐式转换可能在多种情形下发生,包括调用方法时和在 ...

  6. 高质量C++/C编程指南(林锐)

    推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐   2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐   20 ...

  7. KVC/KVO原理详解及编程指南

    一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...

  8. iOS多线程编程指南(二)线程管理

    当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何 ...

  9. 使用委托(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/ms173172.aspx 委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针.  与 C 函数 ...

随机推荐

  1. 某代理网站免费IP地址抓取测试

    源代码在测试中... http://www.AAA.com/nn/|    122.6.107.107|    8888|    山东日照|    高匿|    HTTP|    |    |     ...

  2. 【MySQL】MySQL的group_concat使用例子

    > 参考的优秀文章 GROUP_CONCAT(expr) > 简单的例子 此函数的功能,是拼接group分组多行的数据为一行,并可以指定去重.排序.分隔符. 例子: select t.na ...

  3. 使用MSCOMM发送任意文件,还有一些注意事项

    第一步:发送文件 FILE* pSENDFILE = _wfopen(m_edit_chosefile, _T("rb"));//以二进制打开待发送文件的的文件指针 fseek(p ...

  4. #使用while循环输入1 2 3 4 5 6 8 9 10

    #!/usr/bin/env python #使用while循环输入1 2 3 4 5 6 8 9 10 import time start = 1 while True: if start == 7 ...

  5. 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...

  6. Bootstrap_表单

    表单样式 一.基础表单 <form > <div class="form-group"> <label>邮箱:</label> &l ...

  7. 64位Linux安装android开发IDE的全过程

    首先特别感谢这个链接: http://www.androiddevtools.cn/ 提供了几乎所有的安卓开发需要用到的资源. 操作系统:CentOS 7. 一.android studio 这个折腾 ...

  8. Pre-Query trigger in Oracle D2k / Oracle Forms

    Pre-Query trigger in Oracle D2k / Oracle Forms DescriptionFires during Execute Query or Count Query ...

  9. CALayer总结(三)

    CPU VS GPU 动画和屏幕上组合的图层实际上被一个单独的进程管理,而不是你的应用程序.这个进程就是所谓的渲染服务.在iOS5和之前的版本是SpringBoard进程(同时管理着iOS的主屏).在 ...

  10. 《Linux内核设计的艺术》学习笔记(一)从开机加电到加载三个汇编源码

      实验内核版本:0.11 ◆ 从开机到main函数的三步: ① 启动BIOS,准备实模式下的中断向量表和中断服务程序: ② 从启动盘加载OS程序到内存中,加载OS程序的工作就是利用第一步中的中断服务 ...