原文地址:https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx
指针类型声明采用下列形式之一:
type* identifier; void* identifier; //allowed but not recommended
以下任一类型均可为指针类型:
-
bool。
-
枚举类型。
-
任何指针类型。
-
任何仅包含非托管类型字段的用户定义的结构类型。
但是,你可在不同的指针类型之间以及指针类型和整型之间进行转换。
例如:
int* p1, p2, p3; // Ok int *p1, *p2, *p3; // Invalid in C#
垃圾回收器并不跟踪是否有任何类型的指针指向对象。
下面是指针类型声明的示例:
|
示例 |
说明 |
|---|---|
|
int* p |
p 是指向整数的指针。 |
|
int** p |
p 是指向整数的指针的指针。 |
|
int*[] p |
p 是指向整数的指针的一维数组。 |
|
char* p |
p 是指向字符的指针。 |
|
void* p |
p 是指向未知类型的指针。 |
例如,请考虑以下声明:
int* myVariable;
myVariable 中包含的地址处找到的 int 变量。
指针转换(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 指针转换为任何其他指针类型,反之亦然。
将间接寻址运算符应用于 null 指针将导致由实现定义的行为。
如果已在固定块中设置指针,则它指向的变量不再是固定的。
下表列出了可在不安全的上下文中对指针执行的运算符和语句:
|
运算符/语句 |
用法 |
|---|---|
|
* |
执行指针间接寻址。 |
|
-> |
通过指针访问结构的成员。 |
|
[] |
为指针建立索引。 |
|
& |
获取变量的地址。 |
|
++ 和 -- |
递增和递减指针。 |
|
+ 和 - |
执行指针算法。 |
|
==、!=、<、>、<= 和 >= |
比较指针。 |
|
stackalloc |
在堆栈上分配内存。 |
|
fixed 语句 |
临时固定变量以便找到其地址。 |