1. 当执行dim p as long这一句代码时,发生了什么?
此时,程序会在内存中分配一个4字节的空间,用0填充,以备写入数据。
请看我执行此句后的内存截图:
绿框处为分配的空间,红框处005FF1B0为空间的首字节地址,它可以用
varptr函数得到。
2. 当执行p=20008时,程序会把20008转成16进制数4E28,然后从低位至高位依次填入保留的空间,所以填充次序是:284E,下面的截图是当程序执行完这句时的内存状态:
二、字节型、整形,单精度,双精度,布尔,货币,Variant
当声明为上面的数据类型时,发生的情况与长整形的情况只有一点不同:
分配的预留空间长度不同,比如双精度会分配8个字节的空间,其实大家都知道,我就不说了。
三、字符串
程序如下:
当程序执行dim str1 as string时,发生了什么?,请看内存截图:
程序为str1在内存中分配了一个4个字节的空间,但一个字符需要2个字节的空间存储,四个字节的空间只能存2个字符啊,这是怎么回事?
事情是这样嘀:
它分配的这4个字节的空间,其实是保存一个长整形数值的,这个长整形数值是一个内存地址。
当执行str1=”abcde”时,可以看到这个空间被0E054EF4填充了:
注意这个填充是按低位到高位的顺序填充的,我们说过这是一个地址,那我们就转到这个地址看一下,见图:
说明如下:
1. 在这个地址处,我们看到了字符串”abcde”,”abcde”被保存在绿框处。
大家注意,所有字符都是用一个2字节整形数表示的,比如a就是用&H0061表示的,你可以查一下ASCII码表,a表示为&H61,而这里&H0061是Unicode表示法。或者在立即窗口中执行?chr(&H0061),就明白了。
但不要忘了,数字在内存中是从低位到高位填充的,所以a在内存中就变成6100,这样内存中61006200630064006500就表示abcde,即圈2绿框处。
2. 那我们如何知道字符串在哪里结束呢?你看圈3处0000(表示空字符),这其实就是用一个空字符来表示字符串结束的位置。
3. 但是第2条中用空字符表示结束有问题,因为我们的字符串中可能包含空字符,遇到这种情况你怎么判断字符串在哪结束?
4. 第3条中的问题如何解决呢?从0E054EF4这个指针(即首位地址)往前数4个字符,圈4处,我们会看到一个长整形数字:0000000A,转成十进制数即是10,这个就是字符串的长度。
示意图如下:
简单总结一下:
当声明一个字符串时,会在内存中预分配一个四字节的空间,这个空间的首地址可以用
varptr(str1)得到。这个空间存的不是字符串本身,当我们给字符串赋值时,程序会在内存中另辟一块空间存放字符串本身,而把另辟的那块空间的首地址写在这个预留的四字节的空间中。这个地址可以用
strptr(str1)得到。
待续…