C# 指针学习笔记之指针类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 指针学习笔记之指针类型相关的知识,希望对你有一定的参考价值。
大学的时候学过C++、C,最近工作也不是很忙,就想起看看C#中的指针,看看、回忆一下啊,指针的用法,以下学习笔记摘自msdn:指针类型
在不安全的上下文中,类型可以是指针类型以及值类型或引用类型。指针类型声明具有下列形式之一:
type* identifier;
void* identifier; //allowed but not recommended
下列类型都可以是指针类型:
- sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool。
- 任何枚举类型。
- 任何指针类型。
- 仅包含非托管类型的字段的任何用户定义的结构类型。
指针类型不继承 object,并且指针类型与 object 之间不存在转换。此外,装箱和取消装箱不支持指针。但是,允许在不同指针类型之间以及指针类型与整型之间进行转换。
当在同一个声明中声明多个指针时,* 仅与基础类型一起使用,而不是作为每个指针名称的前缀。例如:
int* p1, p2, p3; // Ok
int *p1, *p2, *p3; // Invalid in C#
指针不能指向引用或包含引用的结构,因为即使有指针指向对象引用,该对象引用也可能会被执行垃圾回收。GC 并不注意是否有任何类型的指针指向对象。
myType* 类型的指针变量的值是 myType
示例 | 说明 |
int* p | p 是指向整数的指针 |
int** p | p 是指向整数的指针的指针 |
int*[] p | p 是指向整数的指针的一维数组 |
char* p | p 是指向字符的指针 |
void* p | p 是指向未知类型的指针 |
指针间接寻址运算符 * 可用于访问位于指针变量所指向的位置的内容。例如,对于下面的声明,
int* myVariable;
*myVariable 表示在 myVariable 中包含的地址处找到的 int 变量。
void*
指针可以为 null。如果将间接寻址运算符应用于 null 指针,则会导致由实现定义的行为。
注意,在方法之间传递指针会导致未定义的行为。示例包括通过 Out 或 Ref 参数向局部变量返回指针或作为函数结果向局部变量返回指针。如果将指针设置在固定的块中,它所指向的变量可能不再是固定的。
下表列出可在不安全的上下文中针对指针执行的运算符和语句:
运算符/语句 | 用途 |
* | 执行指针间接寻址。 |
-> | 通过指针访问结构的成员。 |
[] | 对指针建立索引。 |
& | 获取变量的地址。 |
++ 和 -- | 递增或递减指针。 |
加、减 | 执行指针算法。 |
==、!=、<、>、<= 和 >= | 比较指针。 |
stackalloc | 在堆栈上分配内存。 |
fixed 语句 | 临时固定变量以便可以找到其地址。 |
// cs_unsafe_keyword.cs
// compile with: /unsafe
using System;
class UnsafeTest
// Unsafe method: takes pointer to int:
unsafe static void SquarePtrParam(int* p)
*p *= *p;
unsafe static void Main()
int i = 5;
// Unsafe method: uses address-of operator (&):
SquarePtrParam(&i);
Console.WriteLine(i);
输出
25
以上是关于C# 指针学习笔记之指针类型的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — 基本数据类型 — 指针:取地址与取值