内存类型

C# 指针使用总结

拈花ヽ惹草 提交于 2020-03-13 09:37:32
C#为了类型安全,默认并不支持指针。但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式。在不安全模式下,我们可以直接操作内存,这样就可以使用指针了。在不安全模式下,CLR并不检测unsafe代码的安全,而是直接执行代码。unsafe代码的安全需要开发人员自行检测。 一、Vs2010中开启unsafe code 的方式 在方法、类、代码块中使用unsafe关键词,如: 1 unsafe static void Main(string[] args){ //代码} 2 3 unsafe 4 { 5 //代码块 6 } 然后再项目上点击鼠标右键,选择“属性”,在“生成”选项卡中选中“允许不安全代码” 二、C#可以定义为指针的类型有 sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, struct(结构体),结构体中只能包括非托管类型。 三、C#指针操作符 操作符 说明 * 取值运算符 & 取址运算符 -> 通过指针处理结构体中的数据(获取或赋值) ++与– 指针增、减操作 fixed 用户暂时固定托管代码中引用类型的位置。 Stackallc 分配内存 例如分配内存 1 char* cptr =

C语言 malloc()、memcpy()、free()等

▼魔方 西西 提交于 2020-03-10 08:54:06
1、malloc()函数: void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。) 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针, 否则返回空指针NULL。 当内存不再使用时,应使用 free() 函数将内存块释放。 malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的,申请的内存是连续的 。 返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。 malloc 函数返回的是 void * 类型,C++:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。 所以必须通过 (int *) 来将强制转换 。 C是能通过编译,不会报错。 规范的程序: (检查返回值是否不是NULL,不检查若申请分配失败便造成 内存泄漏 ) type *p; if(NULL == (p = (type*)malloc(sizeof(type)))) /*请使用if来判断,这是有必要的*/

C语言指针

夙愿已清 提交于 2020-03-08 20:00:15
10 指针 指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。只要作到这些,指针也是不难掌握的。 10.1 地址指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。 可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时,银行工作人员将根据我们的帐号去找我们的存款单, 找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针, 存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针

C++指针小结

走远了吗. 提交于 2020-03-08 19:25:19
/*--> */ /*--> */ 一、指针基本概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。学习指针必须了解如下四个内容: 1 指针的类型:去掉标识符,指针的类型对于机器而言都是一样的 2 指针指向的类型:去掉标识符和左边的 * 3 指针的值:一个 32 位的数值(一般是内存地址) 4 指针指向的内存区域:指针的值代表指针指向内存区域的首地址,指针指向的类型决定了该内存区域的大小。指针的移位操作和指针指向的类型有关动,指针一次移动一个 sizeof (指针指向的类型)大小。      (1)int*ptr =0;// 指针的类型是 int* 指针所指向的类型是 int ,指针的值为 0 (非法地址)表示指针未指向合法内存。    (2)int**ptr;// 指针的类型是 int** 指针所指向的的类型是 int*    (3)int(*ptr)[3];// 指针的类型是 int(*)[3] 指针所指向的的类型是 int()[3]    (4)int*(*ptr)[4];// 指针的类型是 int*(*)[4] 指针所指向的的类型是 int*()[4] 二、指针相关的运算: 1& :取地址运算符,返回结果是一个指针(地址值都可以转换为指针), &a 的运算结果是一个指针,指针的类型是 a 的类型加个 * ,指针所指向的类型是 a 的类型,指针所指向的地址

C++面试题

时光怂恿深爱的人放手 提交于 2020-03-08 08:06:32
语言基础类 1. 指针和引用的区别? (1)指针有自己的一块空间,而引用只是一个别名;  (2)使用 sizeof 看一个指针的大小为 4 字节(32位,如果要是64位的话指针为8字节),而引用则是被引用对象的大小。 (3) 引用必须在定义时被初始化,指针不必; (4)不存在指向空值的引用,但存在指向空值的指针。 2.static和 const的用法,(能说出越多越好)(重点) 首先说说const的用法(绝对不能说是常数) 1.限定变量为不可修改。 2.限定成员函数不可以修改任何数据成员。 3.使用const关键字修饰的变量,一定要对变量进行初始化 下面的声明都是什么意思? const int a; a是一个常整型数 int const a; a是一个常整型数 const int *a; a是一个指向常整型数的指针,整型数是不可修改的,但指针可以 int * const a; a为指向整型数的常指针,指针指向的整型数可以修改,但指针是不可修改的 int const * a const; a是一个指向常整型数的常指针,指针指向的整型数是不可修改的,同时指针也是不可修改的 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

Java数据类型的划分/选用

筅森魡賤 提交于 2020-03-08 00:18:05
数据的分类:JAVA中数据类型分两种,基本数据类型 和 引用数据类型。 引用数据类型,牵扯到内存关系的使用 所有 引用类型 (数组,类,接口)的默认值为 :NULL 1 描述数组的首选是int(整数),double(小数); 2 如果要进行数据传输或者进行文字编码转换,使用byte类型(二进制处理操作) 3 处理中文的时候最方便的操作使用的是字符char来完成(可选概念); 4 描述内存或文件大小,描述表的主键列(自动增长)可以使用Long; 来源: https://www.cnblogs.com/shitulaoma/p/12439170.html

python——变量的高级使用

本秂侑毒 提交于 2020-03-05 16:53:35
变量进阶(理解) 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据的地址 ,就叫做 引用 使用 id() 函数可以查看变量中保存数据所在的 内存地址 注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用 变量 不再 对之前的数据引用 变量 改为 对新赋值的数据引用 1.2 变量引用 的示例 在 Python 中,变量的名字类似于 便签纸 贴在 数据 上 定义一个整数变量 a ,并且赋值为 1 代码 图示 a = 1 | 将变量 a 赋值为 2 代码 图示 a = 2 | 定义一个整数变量 b ,并且将变量 a 的值赋值给 b 代码 图示 b = a | 变量 b 是第 2 个贴在数字 2 上的标签 1.3 函数的参数和返回值的传递 在 Python 中,函数的 实参 / 返回值 都是是靠 引用 来传递来的 def test(num): print("-" * 50) print("%d 在函数内的内存地址是 %x" % (num, id(num))) result

float与double的范围和精度

放肆的年华 提交于 2020-03-05 10:13:57
转载: http://hi.baidu.com/630270730/item/a4d92e24007be1130875089f float与double的范围和精度 1. 范围 float和double的范围是由指数的位数来决定的。 float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) 于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。 其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。 float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。 2. 精度 float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。 float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字

Java面试题收集学习整理1

家住魔仙堡 提交于 2020-03-05 06:24:28
1、java序列化、反序列化及serialVersionUID作用 把Java对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为Java对象的过程称为对象的反序列化。对象的序列化主要有两种用途: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 在网络上传送对象的字节序列。 凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量: private static final long serialVersionUID; 默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID,也有可能相同。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。 serialVersionUID 用来表明类的不同版本间的兼容性。有两种生成方式: 一个是默认的1L,比如:private

Java的运行原理

允我心安 提交于 2020-03-05 03:20:16
在 Java 中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在 Java 中,这种供虚拟机理解的代码叫做 字节码 (ByteCode)(class文件的内容) ,它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。 Java 源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。 跨平台: 话说,在北京,一般都是讲北京话的,上海,一般都是将上海话,广东,广东话... 现有一公文发出,要全国执行,该当如何?——先统一翻译成普通话。各地在将普通话版本翻译成当地的方言。 这里,北京、上海就是不同类型的机器windows,linux... 编译(javac)就是将公文翻译成普通话的过程,而编译出的.class文件,就是公文的普通话版本。 在执行的时候,各地的翻译就是jvm,负责将.class转换成本地能够理解的方言来执行。 *.jav a→ *.class →机器码 java 编译器 ( 编译 ) → 虚拟机 ( 解释执行 ) → 解释器 ( 翻译 ) →