数组,不同类型的存取

【概念】

数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。

内存有两个东西:值、地址(首地址、整个地址等)。

【值与地址】

以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之前的字符个数)

posted @ 2023-10-23 18:11  夕西行  阅读(30)  评论(0编辑  收藏  举报