指针

指针

内存和地址

       对于一个占用4个字节的int型数据,它有一个地址,至于它的地址是它最左边还是最右边的那个字节的位置,不同的机器有不同的规定

       还有一个比较蛋疼的边界对齐boundary alignment,就是要求对其的机器上,整型值存储的起始位置只能是某些特定的字节,通常是24的倍数。这也导致了有些数组的内存浪费。

       对于名字和内存位置之间的关联并不是硬件提供的,而是由编译器为我们实现的。

值和类型

       不管是int数、float数还是double型的数据,存储在计算机上的全是0或者1。所以对该数值的解析就决定了它的结果。比如下例:

一个二进制数为0110 0111 0110 1100 0110 1111 0110 0010

解析为:

类型

132int

1735159650

216int

2647628514

4个字符

glob

浮点数

1.116533X1024

机器指令

beg.+110ble.+102

       所以对于相同的数据,不同的解析方式决定了它的结果。

指针变量的内容

int *d=&a;的含义为da的地址,可以分解为int *d; d = &a;千万不要理解成了da的值。

未初始化和非法的指针

       未初始化的指针极具危险。指针必须初始化方可使用。

NULL指针

       标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。要使一个指针变量为NULL,你可以给它赋一个零值。

指针、间接访问和左值

       指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。比如*a = 10 – *a

指针常量

       假设int a的地址为100,那么*100 = 25;代表的意思貌似是将25赋值给a,因为a是位置100所存储的变量,但是这个语句是错 的。这个语句是非法的,因为字面值100的类型是整型,而间接访问操作只能作用于指针类型表达式。所以,如果确实希望实现上面貌似代表的含义,需要使用强制类型转换,即*(int *)100 = 25

指针运算

       指针加法的 在于可以自动调整跳过的字节数,比如+1,对于char1个字节,而int4个字节,double可能就是8个字节。

关系运算

       只用当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。

       指针运算只有作用于数组中其结果才是可以预测的。对任何并非指向数组元素的指针执行算术运算是非法的(但常常很难被检测到)。

总结

l  大多数编译器都不会检查指针表达式的结果是否位于合法的边界之内。因此,程序员应该负起责任;

l  不要对一个为初始化的指针变量进行解引用;

l  不要对一个NULL指针进行解引用。

enable windows 7 support 6G memory

关于windows7 64位6G内存只能识别2G或4G的问题

解决方法为:

测试一下几个内存插槽的顺序;

我刚开始的顺序为 1 1 1 0,只有2G可用;

改为顺序0 1 1 1 ,此时有4G可用;

最后改为1 0 1 1,完美支持4G。

PS:其中1为插内存条。当然,如果是8G,4个全插,应该就没有我的这个问题了。

也有可能是硬件识别或者系统驱动的原因。