C# 指针学习笔记之指针类型

大学的时候学过C++、C,最近工作也不是很忙,就想起看看C#中的指针,看看、回忆一下啊,指针的用法,以下学习笔记摘自msdn:指针类型

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

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

下列类型都可以是指针类型:

指针类型不继承 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* 类型的指针应用间接寻址运算符。但是,可以使用强制转换将 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
时间: 2024-10-26 05:54:23

C# 指针学习笔记之指针类型的相关文章

C# 指针学习笔记之fixed 语句

大学的时候学过C++.C,最近工作也不是很忙,就想起看看C#中的指针,看看.回忆一下啊,指针的用法,以下学习笔记摘自msdn:fixed 语句 fixed 语句禁止垃圾回收器重定位可移动的变量.fixed 语句只能出现在不安全的上下文中.Fixed 还可用于创建固定大小的缓冲区. 备注 fixed 语句设置指向托管变量的指针并在 statement 执行期间"钉住"该变量.如果没有 fixed 语句,则指向可移动托管变量的指针的作用很小,因为垃圾回收可能不可预知地重定位变量.C# 编译

C语言中的函数指针学习笔记_C 语言

一.定义函数指针 return_type (*func_pointer)(parameter_list) 普通指针变量的定义 int * p; char * pointer; 类型的限定都在变量前面: 函数指针类型的限定是前后都有,前面是返回类型,后面是输入参数. 利用typedef 可以简化上面的表达方式. typedef return_type (*FunctionPointer) (parameter_list); FunctionPointer func_pointer; 这样是不是容易

智能指针学习笔记

1. 介绍 本文介绍智能指针的使用.智能指针是c++ 中管理资源的一种方式,用智能指针管理资源,不必担心资源泄露,将c++ 程序员 从指针和内存管理中解脱出来,再者,这也是c++发展的趋势(这话不是我说的,见<Effective c++>和<c++实践编程>),应该认真学习一下. 智能指针中,最有名的应该数auto_ptr,该智能指针已经被纳入标准库,只需要包含<memory>头文件即可以使用,另外,TR1文档定义的shared_ptr和weak_ptr也已经实现(我用

C语言中函数 与 指针学习笔记

一.指向函数的指针 函数名可以在表达式中被解读成"指向函数的指针",因此,正如代码清单 2-2 的实验那样,写成 func 就可以取得指向函数的指针. "指向函数的指针"本质上也是指针(地址),所以可以将它赋给指针型变量. 比如有下面的函数原型: int func(double d); 保存指向此函数的指针的变量的声明如下: int (*func_p)(double); 然后写成下面这样,就可以通过 func_p 调用 func, int (*func_p)(dou

Python核心编程学习笔记之映射类型(上)

 根据核心编程第二版学习Python3.x的内容,可能有些欠缺,有些方法在3.x中已经不提供了,就暂时先略过了.等以后再对比2.x和3.x的区别,作下笔记吧 1.    Python中字典的定位: a)      字典是python中唯一的映射类型,通常被认为是可变的哈希表. b)     字典对象是可变的,能存储任意多个python对象. c)      字典是Python中最强大的数据类型之一 2.    字典(dict)和序列类型容器类(列表和元组)的区别: a)      存储和访问数据

TypeScript 学习笔记之基本类型

  TypeScript 是 JavaScript 的超集,TypeScript 经过编译之后都会生成 JavaScript 代码.TypeScript 最大的特点就是类型化,因此才叫做 TypeScript.比起弱类型的 JavaScript,类型化的 TypeScript 显得更加容易维护. 在 TypeScript 中一共有 7 种基本类型. 1.boolean 代码如下: var isDone: boolean = false; 2.number 代表 JavaScript 中的数字.在

java学习笔记2--数据类型、数组

1.数据类型 Java数据类型有: 原始数据类型(Primitive Data Types ) 引用类型(reference type ) Java原始数据类型又称基本数据类型,它说明了在程序中所能表示的基础数据的种类,通常有8种.引用类型包括类.接口等,具体内容将在后面文章中介绍. Java原始(基本)数据类型: boolean     布尔型,           只有真(true)与假(false)  byte        8位符号整数,     取值范围-128-+127  short

TypeScript 学习笔记之基本类型_javascript技巧

在 TypeScript 中一共有 7 种基本类型. 1.boolean 复制代码 代码如下: var isDone: boolean = false; 2.number 代表 JavaScript 中的数字.在 JavaScript 中,无论是"整数"还是"浮点数",都是以双精度浮点类型存储的. 复制代码 代码如下: var height: number = 6; 3.string 代表字符串.跟 JavaScript 一样,可以使用一对双引号(")或一

javascript学习笔记--数字格式类型_javascript技巧

可能有人说这是什么个格式?其实还不止呢.1          //11.2       //1.21.2e3    //12001.2e+3  //12001.2e-3   //0.0012.12e+2  //12-.12e-2 //-0.0012 当然这些只是十进制.我们来说说 八进制 和 十六进制.0x00, 0x11, 0xff 这种格式是十六进制,他们的十进制值分别是 0, 17, 255. 01, 07, 010, 012 这个是 八进制.(这里的 0 是数字 0,不是字母o)可能有朋