C#操作指针

如何:递增和递减指针

使用增量和减量运算符 ++ 和 -- 可以将 pointer-type* 类型的指针的位置改变 sizeof (pointer-type)。 增量和减量表达式的形式如下:

++p;
p++;
--p;
p--;

增量和减量运算符可应用于除 void* 类型以外的任何类型的指针。

对 pointer-type 类型的指针应用增量运算符的效果是将指针变量中包含的地址增加 sizeof (pointer-type)。

对 pointer-type 类型的指针应用减量运算符的效果是从指针变量中包含的地址减去 sizeof (pointer-type)。

当运算溢出指针范围时,不会产生异常,实际结果取决于具体实现。

示例

此示例通过将指针增加 int 的大小来遍历一个数组。 对于每一步,此示例都显示数组元素的地址和内容。

class IncrDecr
{
    unsafe static void Main()
    {
        int[] numbers = {0,1,2,3,4};

        // Assign the array address to the pointer:
        fixed (int* p1 = numbers)
        {
            // Step through the array elements:
            for(int* p2=p1; p2<p1+numbers.Length; p2++)
            {
                System.Console.WriteLine("Value:{0} @ Address:{1}", *p2, (long)p2);
            }
        }
    }
}
//Output--------------------
Value:0 @ Address:12860272
Value:1 @ Address:12860276
Value:2 @ Address:12860280
Value:3 @ Address:12860284
Value:4 @ Address:12860288

指针的算术运算

本主题讨论使用算术运算符 + 和 - 来操作指针。不能对 void 指针执行任何算术运算。

对指针执行加减数值操作

可以将类型为 intuintlongulong 的值 n 与 void* 以外任何类型的指针 p 和 相加。 结果 p+n 是加上 n * sizeof(p) to the address of p 得到的指针。

同样,p-n 是从 p 的地址中减去 n * sizeof(p) 得到的指针。

指针相减操作

也可以对相同类型的指针进行减法运算。 计算结果的类型始终为 long。 例如,如果 p1 和 p2 都是类型为 pointer-type* 的指针,则表达式 p1-p2 的计算结果为:

((long)p1 - (long)p2)/sizeof(pointer_type)

当算术运算溢出指针范围时,不会产生异常,并且结果取决于具体实现。

class PointerArithmetic
{
    unsafe static void Main()
    {
        int* memory = stackalloc int[30];
        long difference;
        int* p1 = &memory[4];
        int* p2 = &memory[10];

        difference = p2 - p1;

        System.Console.WriteLine("The difference is: {0}", difference);
    }
}
// Output:  The difference is: 6

 指针比较

可应用下面的运算符比较任意类型的指针:

==   !=   <   >   <=   >=

比较运算符比较两个操作数的地址,就像他们是无符号整数一样

class CompareOperators
{
    unsafe static void Main()
    {
        int x = 234;
        int y = 236;
        int* p1 = &x;
        int* p2 = &y;

        System.Console.WriteLine(p1 < p2);//True
        System.Console.WriteLine(p2 < p1);//False
    }
}
时间: 2024-10-10 09:03:19

C#操作指针的相关文章

【通过操作指针,与指针做函数參数&amp;#39;实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 由于p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据

通过操作指针,与指针做函数参数&#39;实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 因为p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据

一个双线程下同时操作指针变量导致野指针出现的问题总结

来源:http://blog.csdn.net/lezhiyong 问题: 在某项目的测试过程中,测试在高清压力测试过程中会偶尔出现RSS崩溃现象,崩溃时间不确定,由于在守护进程服务的守护下,RSS崩溃后被重新拉起,所以这个故障在崩溃马上发送时在网管上并没有体现服务停止的告警,只有当测试人员去RSS的var/run目录下找到edum***开头的文件才指定RSS发送崩溃.根据文件中提供的崩溃时间描述,有时是几天前的,有时是几个小时前的,测试人员较难回忆其当时做了什么操作.根据多个edum***文件

一个双线程下同一时候操作指针变量导致野指针出现的问题总结

来源:http://blog.csdn.net/lezhiyong 问题: 在某项目的測试过程中,測试在高清压力測试过程中会偶尔出现RSS崩溃现象,崩溃时间不确定,因为在守护进程服务的守护下,RSS崩溃后被又一次拉起.所以这个故障在崩溃立即发送时在网管上并没有体现服务停止的告警,仅仅有当測试人员去RSS的var/run文件夹下找到edum***开头的文件才指定RSS发送崩溃.依据文件里提供的崩溃时间描写叙述.有时是几天前的,有时是几个小时前的.測试人员较难回顾其当时做了什么操作. 依据多个edu

第三周 项目五-数组做数据成员(四)文件操作-指针

/* * Copyright (c) 2015, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:冷基栋 * 完成日期:2015年 3 月 21 日 * 版 本 号:v1.0 */ 代码 #include <iostream> #include <cstdlib> #include <fstream> using namespace std; const int N=500; class Salary { p

C#之指针操作

之前听人说C#没有指针,因为不安全,百度了一下是这么说的: 现在因为工作需要操作硬件看门狗,知道原来C#也是可以操作指针的. 程序环境:.NET MicroFramework 开发工具:VisualStudio 2013开发语言:C#通信工具:新生命神码工具 程序功能:我们的开发硬件在特殊外围情况下可能会出新死机现象.解决方法是通过看门狗程序发现死机,然后C#让MCU指针复位.让MCU重启. C#操作单片机指针程序操作如下: 代码: using System; using Microsoft.S

【C++ Primer每日一刷之七】指针操作

4.2.3 指针操作 指针提供间接操纵其所指对象的功能.与对迭代器进行解引用操作一样,对指针进行解引用可访问它所指的对象,* 操作符(解引用操作符)将获取指针所指的对象: string s("hello world"); string *sp = &s; // sp holds theaddress of s cout <<*sp; // prints hello world 对 sp 进行解引用将获得 s 的值,然后用输出操作符输出该值,于是最后一条语句输出了 s

深入理解数据类型、变量类型属性、内存四区和指针

数据类型可理解为创建变量的模具(模子):是固定内存大小的别名. 数据类型的作用:编译器预算对象(变量)分配的内存空间大小. 既能读又能写的内存对象,称为变量:若一旦初始化后不能修改的对象则称为常量. 变量本质:(一段连续)内存空间的别名. 内存四区 栈区(stack):也叫临时区,由编译器自动分配释放,存放函数的参数值,局部变量的值等. 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收. 全局区(静态区)(static):全局变量和静态变

文件操作

1.C文件操作 2.c++文件操作 3.MFC文件操作:CFile是MFC的文件操作基本类,它直接支持无缓冲的二进制磁盘I/O操作,并通过其派生类支持文本文件.内存文件和socket文件. Visual C++处理的文件通常分为两种: 文本文件:只可被任意文本编辑器读取ASCII文本. 二进制文件:指对包含任意格式或无格式数据的文件的统称. 1.定义文件变量 定义文件变量格式:CStdioFile 文件变量: 例如,定义一个名称为f1的文件变量,语句如下:CStdioFile f1; 2.打开指