值类型与引用类型
值类型与引用类型
- 值类型变量存储的是数据本身,引用类型变量存储的是数据的地址。
- 值类型数据事先就能预知需要分配的内存空间,而引用类型数据事先通常不能预知需要分配的内存空间。
- 值类型有:
int,double,bool,char,struct类型等。 - 引用类型有:
string,数组,class类型。 - 只有引用类型变量可以赋值为
null,表示没有数据。
内存分配
- 声明变量时计算机就会分配内存,变量名就代表了这块内存的地址。
- 引用类型数据可以用
new关键字申请内存。"likang"; // 分配了6 *2个字节的内存(其实还有一个结束符),一个char占2个字节。 new int[10]; // 分配了4*10个字节的内存。 new Hero(); // 分配的内存要看Hero类中数据。 - 分配内存时要明确分配的大小。
- 引用类型变量用4个字节(32位机的地址长度就是32位)存储一个内存地址。
double a; // 分配8个字节,因为每个double固定占8个字节。 int[] b; // 数组是引用类型,分配4个字节存储地址。 - 给引用类型变量赋值是把数据的首地址赋值给变量。
int[] a = new int[10]; // 执行过程: // 1.申明a变量,分配4个字节的内存。 // 2.new int[10],分配连续的40个字节内存。 // 3.把这40个字节内存的首地址赋值给a。
访问变量的过程
- 值类型是直接访问数据的。
- 引用类型要通过引用的地址访问数据。
ref
- 交换两个变量中的数据。
解释
struct中不能定义本类型的变量,但class中可以定义本类型的变量。
案例分析
- 传值与传引用
- 修改引用参数中的数据
- 修改引用参数
结构与类的区别
最早的类就是从结构演变过来的,
C++中struct和class是完全一样的。但在C#中他们有了不同的分工。
struct表示一个包含多个数据的复合数据类型,class用来封装一类事物的属性、方法、事件等。struct是值类型,class是引用类型。struct中的变量不能赋初值,class的可以。struct中不能有本类型的成员变量,class中可以有。struct的构造函数要给所有成员变量赋值,class不必。- 但定义了一个有参构造函数后
struct中还会有默认无参构造函数,class中就不会了。 struct中必需有一个可访问的无参构造函数,class中可以没有。