精华内容
下载资源
问答
  • intptr
    2021-11-09 15:25:19

    今天在看公司的代码时,发现一个 int_t 类型的变量,然后我就ctrl + 左键 点进去看,发现这个int_t 类型是由 intptr_t 类型定义的。然后当我在ctrl + 左键 点进去看,然后知道这个intptr_t 类型是头文件里面的。经过我一番向长辈询问得知,先总结如下。

    操作系统

    现在我们的操作系统 基本上就是32位和64位的 。

    位数charshortintlong指针
    321个字节8位2个字节16位4个字节32位4个字节32位4个字节32位
    641个字节8位2个字节16位4个字节32位8个字节64位8个字节64位

    所以 我们可以看出来,在不同位数的操作系统上,我们使用int类型的变量,它都是32位的。而我们使用指针 时,它的位数 会随操作系统的位数而改变。

    但是可以看出long 也可以达到同样的效果,但是为了保证平台的通用性,程序中尽量不要使用long类型。

    更多相关内容
  • C#学习(十一)——IntPtr类型

    千次阅读 2020-06-30 12:56:28
    1.C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。 2.资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将是64位;但...

    1.C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄

    2.资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将是64位;但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。

    3.在调用API函数时,类似含有窗口句柄参数HANDLE)的原型函数,应显示地声明为IntPtr类型

    4.IntPtr类型对多线程操作是安全的。
    5. int 和IntPtr互转

    int i=1; 
    IntPtr p=new IntPtr(i);  
    int ch_i=(int) p;
    
    1. IntPtr和string互转
    string str="a";
     
    IntPtr p=Marshal.StringToHGlobalAnsi(str);
     
    string s=Marshal.PtrToStringAnsi(p);
     
    Marshal.FreeHGlobal(p);
    

    原文链接:https://blog.csdn.net/weixin_40327927/article/details/99685538

    C# IntPtr 与 string互转

    一、IntPtr 与 string互转

    string str = “aa”;

    IntPtr init = Marshal.StringToHGlobalAnsi(str);

    string ss= Marshal.PtrToStringAnsi(init);

    //最后释放掉

    Marshal.FreeHGlobal(init);

    二、char*与string互转

    string a = “11”;

    char* aChar = (char*)System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(a).ToPointer();

    string result = Marshal.PtrToStringAnsi((IntPtr)aChar);

    三、char 与 IntPtr互转*

    可以直接强制类型转换

    IntPtr init = (IntPtr)aChar;

    char* aChar = (char*)init;

    原文链接:https://blog.csdn.net/jianyoucheng/article/details/12651763

    C#中的IntPtr

    IntPtr是一个,用于包装调用WindowsAPI函数的指针,根据平台的不同,底层指针可以是32位或64位;它用以表示指针或句柄的平台特定类型,C#中主要用它调用C++\C封装的DLl库;下面主要介绍IntPtr的常见用法

    1.int类型与IntPtr类型之间的转换

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyIntPtr
    {
        class Program
        {
            static void Main(string[] args)
            {
                int nValue1 = 10;
                int nValue2 = 20;
                //AllocHGlobal(int cb):通过使用指定的字节数,从进程的非托管内存中分配内存。
                IntPtr ptr1 = Marshal.AllocHGlobal(sizeof(int));
                IntPtr ptr2 = Marshal.AllocHGlobal(sizeof(int));
                //WriteInt32(IntPtr ptr, int val):将 32 位有符号整数值写入非托管内存。
                //int->IntPtr
                Marshal.WriteInt32(ptr1, nValue1);
                Marshal.WriteInt32(ptr2, nValue2);
                // ReadInt32(IntPtr ptr, int ofs):从非托管内存按给定的偏移量读取一个 32 位带符号整数
                //IntPtr->int
                int nVal1 = Marshal.ReadInt32(ptr1, 0);
                int nVal2 = Marshal.ReadInt32(ptr2, 0);
                //FreeHGlobal(IntPtr hglobal):释放以前从进程的非托管内存中分配的内存。
                Marshal.FreeHGlobal(ptr1);
                Marshal.FreeHGlobal(ptr2);
            }
        }
    }
    

    2.string类型与IntPtr之间的转换

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyIntPtr
    {
        class Program
        {
            static void Main(string[] args)
            {
                string str = "aa";
                IntPtr strPtr = Marshal.StringToHGlobalAnsi(str);
                string ss = Marshal.PtrToStringAnsi(strPtr);
                Marshal.FreeHGlobal(strPtr);  
            }
        }
    }
    

    3.结构体与IntPtr之间的转换

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyIntPtr
    {
        class Program
        {
            public struct stuInfo
            {
                public string Name;
                public string Gender;
                public int Age;
                public int Height;
            }
            static void Main(string[] args)
            {
                stuInfo stu = new stuInfo()
                {
                    Name = "张三",
                    Gender = "男",
                    Age = 23,
                    Height = 172,
                };
    
                //获取结构体占用空间的大小
                int nSize = Marshal.SizeOf(stu);
                //声明一个相同大小的内存空间
                IntPtr intPtr = Marshal.AllocHGlobal(nSize);
                //IntPtr->Struct
                Marshal.StructureToPtr(stu, intPtr,true);
                //Struct->IntPtr
                stuInfo Info =(stuInfo)Marshal.PtrToStructure(intPtr, typeof(stuInfo));
    
                Console.ReadKey();
    
            }
        }
    }
     
    

    转载于:https://www.cnblogs.com/QingYiShouJiuRen/p/10274197.html

    intptr_t详解

    看leveldb代码时候发现inptr_t居然不知道是啥,搜索了一番发现一个比较官方的解释:

    尽管大部分程序员习惯自由使用标准类型, 如 int 和 long, 编写设备驱动需要一些小心来避免类型冲突和模糊的 bug.

    这个问题是你不能使用标准类型, 当你需要"一个 2-字节 填充者"或者"一个东西来代表一个4-字节 字串", 因为正常的 C 数据类型在所有体系上不是相同大小. 为展示各种 C 类型的数据大小, datasize 程序已包含在例子文件 misc-progs 目录中, 由 O’ Reilly’s FTP 站点提供. 这是一个程序的样例运行, 在一个 i386 系统上(显示的最后 4 个类型在下一章介绍):

    morgana% misc-progs/datasize
    arch Size: char short int long ptr long-long u8 u16 u32 u64
    i686 1 2 4 4 4 8 1 2 4 8
    这个程序可以用来显示长整型和指针在 64-位 平台上的不同大小, 如同在不同 Linux 计算机上运行程序所演示的:

    arch Size: char short int long ptr long-long u8 u16 u32 u64
    i386 1 2 4 4 4 8 1 2 4 8
    alpha 1 2 4 8 8 8 1 2 4 8
    armv4l 1 2 4 4 4 8 1 2 4 8
    ia64 1 2 4 8 8 8 1 2 4 8
    m68k 1 2 4 4 4 8 1 2 4 8
    mips 1 2 4 4 4 8 1 2 4 8
    ppc 1 2 4 4 4 8 1 2 4 8
    sparc 1 2 4 4 4 8 1 2 4 8
    sparc64 1 2 4 4 4 8 1 2 4 8
    x86_64 1 2 4 8 8 8 1 2 4 8
    注意有趣的是 SPARC 64 体系在一个 32-位 用户空间运行, 因此那里指针是 32 位宽, 尽管它们在内核空间是 64 位宽. 这可用加载 kdatasize 模块(在例子文件的 misc-modules 目录里)来验证. 这个模块在加载时使用 printk 来报告大小信息, 并且返回一个错误( 因此没有必要卸载它 ):

    kernel: arch Size: char short int long ptr long-long u8 u16 u32 u64
    kernel: sparc64 1 2 4 8 8 8 1 2 4 8
    尽管在混合不同数据类型时你必须小心, 有时有很好的理由这样做. 一种情况是因为内存存取, 与内核相关时是特殊的. 概念上, 尽管地址是指针, 内存管理常常使用一个无符号的整数类型更好地完成; 内核对待物理内存如同一个大数组, 并且内存地址只是一个数组索引. 进一步地, 一个指针容易解引用; 当直接处理内存存取时, 你几乎从不想以这种方式解引用. 使用一个整数类型避免了这种解引用, 因此避免了 bug. 因此, 内核中通常的内存地址常常是 unsigned long, 利用了指针和长整型一直是相同大小的这个事实, 至少在 Linux 目前支持的所有平台上.
    因为其所值的原因, C99 标准定义了 intptr_t 和 uintptr_t 类型给一个可以持有一个指针值的整型变量. 但是, 这些类型几乎没在 2.6 内核中使用.

    总而言之就是:intptr_t是为了跨平台,其长度总是所在平台的位数,所以用来存放地址。
    参考:http://www.cnblogs.com/Anker/p/3438480.html

    /* There is some amount of overlap with <sys/types.h> as known by inet code */
    #ifndef __int8_t_defined
    # define __int8_t_defined
    typedef signed char         int8_t;
    typedef short int          int16_t;
    typedef int               int32_t;
    # if __WORDSIZE == 64
    typedef long int          int64_t;
    # else
    __extension__
    typedef long long int        int64_t;
    # endif
    #endif
     
    /* Unsigned.  */
    typedef unsigned char         uint8_t;
    typedef unsigned short int    uint16_t;
    #ifndef __uint32_t_defined
    typedef unsigned int          uint32_t;
    # define __uint32_t_defined
    #endif
    #if __WORDSIZE == 64
    typedef unsigned long int       uint64_t;
    #else
    __extension__
    typedef unsigned long long int    uint64_t;
    #endif
    
    /* Types for `void *' pointers.  */
    #if __WORDSIZE == 64
    # ifndef __intptr_t_defined
    typedef long int               intptr_t;
    #  define __intptr_t_defined
    # endif
    typedef unsigned long int    uintptr_t;
    #else
    # ifndef __intptr_t_defined
    typedef int                    intptr_t;
    #  define __intptr_t_defined
    # endif
    typedef unsigned int        uintptr_t;
    #endif
    

    原文链接:https://blog.csdn.net/macchan/article/details/38701811

    展开全文
  • IntPtr

    2018-10-19 15:37:30
    C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 所以,在您调用的API函数中...

    C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。

    所以,在您调用的API函数中一定有类似窗体句柄这样的参数,那么当您声明这个函数时,您应该将它显式地声明为IntPtr类型。

    例如,在一个C#程序中调用Win32API mciSendString函数控制光盘驱动器,这个函数的函数原型是:

    MCIERROR mciSendString(

    LPCTSTR lpszCommand,
    LPTSTR lpszReturnString,
    UINT cchReturn,
    HANDLE hwndCallback
    );

    首先在C#中声明这个函数:
    [DllImport("winmm.dll")]
    private static extern long mciSendString(string a,string b,uint c,IntPtr d);

    然后用这样的方法调用:
    mciSendString("set cdaudio door open", null, 0, this.Handle);

    您也可以使用IntPtr.Zero将句柄设置为0;
    或者使用类型强制转换:
    mciSendString("set cdaudio door open", null, 0, (IntPtr)0 );

    或者,使用IntPtr构造函数:
    IntPtr a = new IntPtr(2121);

    这里有两点比较重要:
    一是在C#中声明Win32API时,一定要按照WinAPI的原型来声明,不要改变它的数据类型;
    二是尽量不要过多使用类型强制转换或构造函数的方式初始化一个IntPtr类型的变量,这样会使程序变得难于理解并容易出错。

     


    托管window 中的句柄,一般在window api 中使用,  IntPtr a=(IntPtr)1;

    展开全文
  • [C++] intptr_t

    2022-05-13 09:13:26
    额 看到windows的消息处理函数,使用的WPARAM和LPARAM竟然是整数,觉得十分惊讶 (因为lParam可以转化为HWND和CREATESTRUCT) typedef UINT_PTR WPARAM;...#ifndef _INTPTR_T_DEFINED #define _INTPTR_T_DEFINED #i

    看到windows的消息处理函数,使用的WPARAM和LPARAM竟然是整数,觉得十分惊讶
    (因为lParam可以转化为HWND(WM_COMMAND限定)和CREATESTRUCT(WM_CREATE限定))

    typedef UINT_PTR WPARAM;
    typedef LONG_PTR LPARAM;
    typedef LONG_PTR LRESULT;
    

    整数能储存地址吗?
    还真能

    intptr_t

    先来观摩一下在corecrt.h里的定义

    #ifndef _INTPTR_T_DEFINED
    #define _INTPTR_T_DEFINED
    #ifndef __intptr_t_defined
    #define __intptr_t_defined
    #undef intptr_t
    #ifdef _WIN64
    __MINGW_EXTENSION typedef __int64 intptr_t;
    #else
    typedef int intptr_t;
    #endif /* _WIN64 */
    #endif /* __intptr_t_defined */
    #endif /* _INTPTR_T_DEFINED */
    

    深挖下去

    #ifndef _INT128_DEFINED
    #define _INT128_DEFINED
    #ifdef __GNUC__
    #define __int8 char
    #define __int16 short
    #define __int32 int
    #define __int64 long long
    #ifdef _WIN64
    #if (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 1)) && \
        !defined(__SIZEOF_INT128__) /* clang >= 3.1 has __int128 but no size macro */
    #define __SIZEOF_INT128__ 16
    #endif
    #ifndef __SIZEOF_INT128__
    typedef int __int128 __attribute__ ((__mode__ (TI)));
    #endif
    #endif
    #endif /* __GNUC__ */
    #endif /* _INT128_DEFINED */
    

    可以发现intptr_t就是一个long long(Win64限定)

    代码

    OK,前情提要结束了,来看看怎么用
    首先模仿windows.,写一个结构体

    struct Event
    {
    	int id;
    	int event;
    };
    

    这个结构体包含了控件(假设有)的身份(id)和事件(event)
    接下来写一个接受事件函数

    void onEvent(int wp,int lp)
    {
    	Event* e = (Event*)wp;
    	cout << dec << "id:" << e->id << "\tevent:" << e->event << endl;
    }
    

    也很简单,直接把int转化为Event*
    最后在main()里面调用一下

    Event e = {10,20};
    cout << &e << "\t" << hex << (intptr_t)&e << endl;
    onEvent((intptr_t)&e,0);
    

    就能看到输出

    0x71feb8        71feb8
    id:10   event:20
    
    --------------------------------
    Process exited after 0.5406 seconds with return value 0
    请按任意键继续. . .
    

    可以看到成功了

    最后

    就一类型转换竟然水了一篇1400字的文章…

    展开全文
  • C# IntPtr类型转换

    2022-07-05 09:29:55
    1. int 和IntPtr互转 int i=1; IntPtr p=new IntPtr(i); int ch_i=(int) p; 2. IntPtr和string互转 string str="a"; IntPtr p=Marshal.StringToHGlobalAnsi(str); string s=Marshal.PtrToStringAnsi(p); Marshal....
  • IntPtr和Byte转化的问题

    2019-10-25 17:54:53
    //这里报错 Operator '/' cannot be applied to operands of type 'System.IntPtr' and 'System.IntPtr' byte b = ptr[(IntPtr)num2 / 1]; //这里报错 Operator '/' cannot be applied to operands of type...
  • C# IntPtr数据类型相关操作 byte[]转IntPtr 优点 缺点 IntPtr转byte Copy byte* IntPtr转Stream 参考链接 byte[]转IntPtr //输入buye[],返回IntPtr IntPtr ArrToPtr(byte[] array) { return System.Runtime....
  • IntPtr p = new IntPtr(i);IntPtr转intint myi = (int)p;MessageBox.Show(myi.ToString());方法二、int转IntPtrint i = 12;IntPtr p =(IntPtr)iIntPtr转intint myi = (int)p;MessageBox.Show(myi....
  • VS-C++ 系列:所有相关C++文章... 1、 IntPtr Handle = Marshal.StringToHGlobalAnsi(Str); string tStr= Marshal.PtrToStringAnsi(Handle); Dxg-原创出品,如需转载,请注明出处; 欢迎收藏,点赞;"一键三联"走起,LOL
  • C# IntPtr转byte数组 byte[]转Intptr

    千次阅读 2021-01-18 17:30:44
    祝好__by Dxg_LC 目录:Dxg_C# 开发小技巧整理集合 1、C# IntPtr转byte数组 byte[]转Intptr Dxg-原创出品,如需转载,请注明出处; 序言: 1、以上链接为方便整理查看资料用;伴随博文发布更新,如果有不正确处,感谢...
  • C# IntPtr数据类型相关操作byte[]转IntPtr优点缺点IntPtr转Stream参考链接 byte[]转IntPtr //输入buye[],返回IntPtr IntPtr ArrToPtr(byte[] array) { return System.Runtime.InteropServices.Marshal....
  • 图1红框中是我临时调试的 目的就是想看看intptr转成byte[]后再转回来还是不是同一个值。结果确实不是! 图二就是在网上找的intptr和byte[]转换的方法。试了很多种就是转不回来! 对了,我的Intptr值来源于虹软...
  • 1 IntPtr类型 C#中的IntPtr类型称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄; 资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将...
  • intptr_t 其实不是指针类型2012-07-16 16:34:52| 分类: C++ |字号 订阅intptr_t 其实不是指针类型分类: C语言 2012-04-23 17:26 336人阅读 评论(0) 收藏 举报最近在看nginx源码,看到有一个类型intptr_t,没有见过...
  • C#中的IntPtr

    2021-07-11 16:18:19
    C#中的IntPtr 1.C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。 2.资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统...
  • C# IntPtr转struct

    2020-12-16 00:59:48
    DEVICE_INFO 结构体名称 var temp = Marshal.PtrToStructure(ptr, typeof(DEVICE_INFO)); DEVICE_INFO struDeviceInfo = (DEVICE_INFO)temp;
  • IntPtr类型

    千次阅读 2019-11-18 10:15:50
    一:什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。 C#中的IntPtr类型称为“平台特定的整数类型”,...
  • C# 中intptr用法

    千次阅读 2020-06-20 09:44:27
    一:什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。对于它的解释,这个哥们写的比较好:It’s a class ...
  • C#中IntPtr打印输出

    2021-12-27 13:44:45
    如何C#中IntPtr打印输出,搜了很多博客,找了一些源码,发现有这个办法: IntPtr m_TripleBuffer= Marshal.AllocHGlobal((int)Size); //此处进行一些操作 //以下把IntPtr中的大量数据读出来,需要选择合适的数组...
  • 1、前言今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量。由于之前没有见过intptr_t这样数据类型,凭感觉认为 intptr_t是int类型的指针。感觉很奇怪,为何要将一个指针这样做呢?如是果断上网查查,...
  • I need to pass a System.IntPtr to a .NET function (Python with python... This pointer should refer to a struct created in cffi.I found this:from CLR.System import IntPtr, Int32i = Int32(32)p = IntPt...
  • C++ intptr_t类型

    千次阅读 2021-07-31 17:10:12
    一、intptr_t类型 intptr_t 和uintptr_t 类型用来存放指针地址。它们提供了一种可移植且安全的方法声明指针,而且和系统中使用的指针长度相同,对于把指针转化成整数形式来说很有用,下面是这个类型的声明 #if __...
  • C#中IntPtr类型

    2020-12-24 18:36:01
    1.C#中的IntPtr类型被称之为“平台特定的整数类型”,用于本机资源,例如窗口句柄。 2.资源的大小取决于使用的硬件和操作系统,即此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统中将是64位;但...
  • c# IntPtr 指针详理解

    千次阅读 2020-08-10 08:47:08
    c# INtPtr 指针详理解 INtPtr是什么 C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的...
  • IntPtr存为raw数据

    2021-08-27 11:39:23
    c#中将IntPtr存为raw数据 将IntPtr转化为raw数据,先降IntPtr转化为byte数组,然后存为raw文件 byte[] laterData = new byte[VolumeDimension.X * VolumeDimension.Z * sizeof(ushort)]; Marshal.Copy(slicePtr, ...
  • C# 海康威视工业相机 IntPtr类型转Image图片
  • C#中的IntPtr

    2011-09-13 19:23:42
    C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 例如,我们可以在vs2008...
  • 关于 intptr_t

    2020-05-26 21:16:42
    intptr_t 一、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小,只规定级别。作下比较: 16位平台 char 1个字节8位 short 2个字节16位 int 2个字节16位 long 4...
  • intptr_t 详解

    2020-09-08 18:17:03
    /* Types for `void *' ...# ifndef __intptr_t_defined typedef long int intptr_t; # define __intptr_t_defined # endif typedef unsigned long int uintptr_t; #else # ifndef __intptr_t_defined typedef int

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,544
精华内容 19,817
关键字:

intptr