C#里使用指针

    指针在C\C++里面可是一个好东西,但是到java,.net的时代指针已经被封装起来,对用户不可见,这点java做的非常的彻底。.net可能因为还存在一个托管C++,因此指针并没有完全废除,C#还是保留了指针的操作。
       要使用指针首先要对使用指针的代码用unsafe进行进行声明,声明和public声明一样,可以对整个类进行声明,也可以是类里面某个方法或者属性。在代码里什么后,还需要修改工程项目的Build属性,让编译器支持指针的操作。
       做好事前的工作就可以使用指针了。指针的使用方法和C++下使用没有太多差别。只要编译器不报错就没有太大问题。
       下面是对指针的一些使用上的理解:
1.  指针类型可以是实体变量(int,double)也可以是enum,同时也支持结构体变量struct。但不能是类。不过空指针可以指向类,只不过空指针不能进行任何操作,也只能把空指针作为传递对象来使用。
2. C#提供一个的关键字stackalloc用于申请堆栈内存。注意,这个申请内存分配的是栈内存,当函数执行完毕后,内存会被自动回收。不过我想用这个栈内存基本可以解决40%的问题,而且使用的时候不必担心内存泄漏问题。
3. .net 好像不直接支持堆内存的申请(这个对.net来说很危险),不过我们可以通过调用win32 api 的方法进行申请。这样就可以解决剩下40%的问题。堆内存申请的方法在MSDN里面有相关的文档,具体实现代码见附1。
4.  结构体是一个特殊的对象。他与类的定义就差一个关键字,使用方法也和类一样,可以定义属性,可以定义方法。但是在进行指针操作的时候双方就有很大的差别了。结构体可以通过sizeof()取得大小,大小与结构体里有多少实体变量有关,但是如果struck里定义了类的对象,或者指针,sizeof可能会编译不过(void* 的空指针例外,不过需要在结构体声明处加上unsafe)。
5. fixed关键字:目前了解的不多,不过有一个很实用的例子可以让指针能够和.net里的数组进行交互操作:
 
                byte[] buffer = new byte[100];
                fixed (byte* p = buffer)
                {
                    P[0] = 123;
                    ……
                }
 
6.  其它
7. 
 
 
 
 
附1:
    public unsafe class Memory
    {
        // Handle for the process heap. This handle is used in all calls to the
        // HeapXXX APIs in the methods below.
        static int ph = GetProcessHeap();
        // Private instance constructor to prevent instantiation.
        private Memory() { }
        // Allocates a memory block of the given size. The allocated memory is
        // automatically initialized to zero.
        public static void* Alloc(int size)
        {
            void* result = HeapAlloc(ph, HEAP_ZERO_MEMORY, size);
            if (result == null) throw new OutOfMemoryException();
            return result;
        }
        // Copies count bytes from src to dst. The source and destination
        // blocks are permitted to overlap.
        public static void Copy(void* src, void* dst, int count)
        {
            byte* ps = (byte*)src;
            byte* pd = (byte*)dst;
            if (ps > pd)
            {
                for (; count != 0; count--) *pd++ = *ps++;
            }
            else if (ps < pd)
            {
                for (ps += count, pd += count; count != 0; count--) *--pd = *--ps;
            }
        }
        // Frees a memory block.
        public static void Free(void* block)
        {
            if (!HeapFree(ph, 0, block)) throw new InvalidOperationException();
        }
        // Re-allocates a memory block. If the reallocation request is for a
        // larger size, the additional region of memory is automatically
        // initialized to zero.
        public static void* ReAlloc(void* block, int size)
        {
            void* result = HeapReAlloc(ph, HEAP_ZERO_MEMORY, block, size);
            if (result == null) throw new OutOfMemoryException();
            return result;
        }
        // Returns the size of a memory block.
        public static int SizeOf(void* block)
        {
            int result = HeapSize(ph, 0, block);
            if (result == -1) throw new InvalidOperationException();
            return result;
        }
        // Heap API flags
        const int HEAP_ZERO_MEMORY = 0x00000008;
        // Heap API functions
        [DllImport("kernel32")]
        static extern int GetProcessHeap();
        [DllImport("kernel32")]
        static extern void* HeapAlloc(int hHeap, int flags, int size);
        [DllImport("kernel32")]
        static extern bool HeapFree(int hHeap, int flags, void* block);
        [DllImport("kernel32")]
        static extern void* HeapReAlloc(int hHeap, int flags,
           void* block, int size);
        [DllImport("kernel32")]
        static extern int HeapSize(int hHeap, int flags, void* block);
    }
 
 

时间: 2024-10-03 22:14:49

C#里使用指针的相关文章

JS里有指针么?

提到 js 指针,其实我是懵圈儿的,准确来说,应该是没有的,引用倒是满天飞.不过下面的这个例子值得看看. Are there pointers in javascript? No, JS doesn't have pointers. Objects are passed around by passing a copy of a reference. The programmer cannot access any C-like "value" representing the add

以一个链表指针作参数传入一个函数里,若此时链表为空,则初始化链表,为什么在主函数中不能用?

问题描述 以一个链表指针作参数传入一个函数里,若此时链表为空,则初始化链表,为什么在主函数中不能用? #include using namespace std; typedef struct Node { int age; struct Node* next; }LIST; void addList1(LIST* pHead,int x)//链表结尾加节点 { LIST* pM=new LIST();//新节点 pM->age=x; pM->next=NULL; if(pHead==NULL)

C语言指针使用方法

为初学者服务.这是本文的宗旨.指针是c和c++中的难点和重点.有些程序员们精通dos下的basic.c语言的其它各种特性,在basic中都有类似的东西.只有指针,是baisc所不具备的.指针是c的灵魂. 我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来. 1.指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指

谈C/C++指针精髓(一)

[摘要] 指针是C和C++语言编程中最重要的概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构, 通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:并能像汇编语言一样处理内存地址,从而编出精练而高效的程序.指针极大地丰富了C和C++语言的功能. 在本文中,主要分两部分对指针进行讨论.首先,基础篇讨论关于指针的内容和运算操作等,可以是读者对指针的知识有一定了解和认识:随后在使用篇中重点讨论指针的各种应用,揭破指针在日常编程中的精髓,从

C++函数指针详解

来源:http://www.cnblogs.com/ggjucheng/archive/2011/12/13/2286391.html 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明.  先声明几个指针放着做例子:   int *ptr; char *ptr; int **ptr; int (*ptr)[3]; int

C++指针的概念解读[超详细]

转自:http://www.codeceo.com/article/cpp-pointer.html 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明. 先声明几个指针放着做例子: 例一: int *ptr; char *ptr; int **ptr; int (*ptr)[3]; int *(*ptr)[4]; 指针的类型 从语法

指针-Java对象引用指向的问题

问题描述 Java对象引用指向的问题 有以下代码: package com.lzw; import java.util.*; public class UpdateStu implements Comparable{ String name; long id; public UpdateStu(long id, String name) { this.id = id; this.name = name; } public int compareTo(Object o) { UpdateStu u

c++用栈弹出指针,ERROR C2109

问题描述 c++用栈弹出指针,ERROR C2109 头文件定义模版 #ifndef STACK_H_ #define STACK_H_ template class Stack { private: int ss; int top; T * sp; public: Stack(int n); ~Stack(); void push(const T &s); T & pop(); }; template Stack::Stack(int n) { ss = n; top = 0; sp =

深入理解c++指针的指针和指针的引用_C 语言

展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i