5

我们如何在 C# 中声明一个 void 指针?

4

3 回答 3

13

void* identifier;

但它需要不安全,因为:

unsafe
{
    void* identifier;
}

并且项目必须允许不安全的代码。

于 2010-06-18T12:16:36.880 回答
3

我假设您的意思是托管代码,因为您的问题很短,除了假设之外什么都做。

我认为您正在寻找IntPtr或只是任何object引用(这是基本类型,空指针的基本等价物 - 对“某物”的引用)。除非你的意思是指针,在这种情况下你正在寻找IntPtr.Zero.

于 2010-06-18T12:17:05.780 回答
1

来自http://msdn.microsoft.com/en-us/library/y31yhkeb%28VS.80%29.aspx

Visual Studio 2005Other Versions22 (共 43 个)评价此内容有帮助 - 评价此主题 在不安全的上下文中,类型可能是指针类型以及值类型或引用类型。指针类型声明采用以下形式之一:

type* identifier; void* identifier;//允许但不推荐 以下任何类型都可能是指针类型:

sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool。

任何枚举类型。

任何指针类型。

任何仅包含非托管类型字段的用户定义结构类型。

指针类型不继承自对象,并且指针类型和对象之间不存在转换。此外,装箱和拆箱不支持指针。但是,您可以在不同的指针类型之间以及指针类型和整数类型之间进行转换。

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

int* p1, p2, p3; // 好的

int *p1, *p2, *p3; // 在 C# 中无效

指针不能指向引用或包含引用的结构,因为即使指针指向对象引用也可能被垃圾回收。GC 不会跟踪对象是否被任何指针类型指向。

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

示例 描述

int* p

p 是一个指向整数的指针

int** p

p 是指向整数的指针

int*[] p

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

char* p

p 是指向 char 的指针

void* p

p 是指向未知类型的指针

指针间接操作符 * 可用于访问指针变量指向的位置的内容。例如,对于以下声明,

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

您不能将间接运算符应用于 void* 类型的指针。但是,您可以使用强制转换将 void 指针转换为任何其他指针类型,反之亦然。

指针可以为空。将间接运算符应用于空指针会导致实现定义的行为。

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

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

运算符/语句使用 *

执行指针间接。

->

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

[]

索引一个指针。

&

获取变量的地址。

++ 和 --

递增和递减指针。

  • 和 -

执行指针运算。

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

比较指针。

堆栈分配

在堆栈上分配内存。

固定语句

临时修复一个变量,以便找到它的地址。

C# 语言规范 有关详细信息,请参阅 C# 语言规范中的以下部分:

18 不安全代码

于 2010-06-18T12:17:10.553 回答