数组,不同类型的存取
【概念】
数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。
内存有两个东西:值、地址(首地址、整个地址等)。
【值与地址】
以10个int元素的数组为例,int [] a = new int[10],计算机给数组分配了一块连续的空间,100-139,其中内存的起始地址为baseAddress = 100
取值,就是通过首地址和该类型宽度(占用字节数)得到。寻址公式:a[i] = baseAddress + i * dataTypeSize
其中,数组首地址baseAddress = 100,数据类型dataTypeSize = 4个字节。
【关于数组名】
数组名是首元素地址,同时数组名还具有串联数组连续地址的意义。
a+1,是首元素地址+一个数据类型大小
&a+1,是首元素地址+数组总的字节大小
除了以下两种情况,所有的数组名都表示数组首元素的地址。
1、sizeof(数组名),计算整个数组的大小。sizeof内部单独放一个数组名,数组名表示整个数组;
2、&数组名,取出的是数组地址。&数组名,数组名表示整个数组,进行加减操作,是偏移整个数组的大小。
【+1与下标】
本质含义:相对于起始地址的偏移量
【赋值取值、不同类型情况】
//char short int long依次占1 2 4 8字节 uchar nArr[4]; //【非越界情况】赋值取值的两种方式 nArr[0] = 1; //下标方式 *nArr = 2; //地址方式 nArr[1] = 3; *(nArr + 1) = 4; //【越界情况】若右侧类型比左侧类型大,用地址方式且左侧用 *(右侧类型*) 修饰。此时取值用memcpy方式。 *(short*)nArr = (short)256; //第1块内存存储低8位,第2块内存存储高8位。0,1 *(short*)(nArr + 2) = (short)257;//同理,第3块内存、第4块内存分别存储0和2 short a,b; memcpy(&a, nArr, sizeof(short)); memcpy(&b, nArr+2, sizeof(short));
另一个例子:
高往低存,可能造成数据截断。如long long 8字节,存入int数组,高4字节被丢弃。
可以将int数组每两个元素分别存储低4字节和高4字节
int a[4]; //隐式转换 *a = 2; //目标格式是int,2 默认值 默认值 默认值 *(long long*)a=2; //目标格式是longlong,2 0 默认值 默认值 *(long long*)(a + 2) = 3; //2 0 3 0
【sizeof、strlen】
sizeof查看占用字节,strlen查看字符串长度(即\0之前的字符个数)