本帖最后由 xieglt 于 2020-8-11 15:32 编辑
编译器通常会优化你的代码,有一种优化叫内存对齐,内存对齐跟你定义的是几级指针无关。
跟CPU和操作系统有关,32位操作系统内存对齐总是在4的整数倍。
这样,内存的访问速度更快。
比如说你定义一个 char c;在程序里它只有一个字节,而实际上,编译器会为它分配4个字节的空间,
以达到内存对齐的效果。
win32系统里,不管你定义几级指针,都是用4个字节来存储它。
你的代码里,强制把8赋值给p2,把5赋值给p1,
再把它们相减,因为你定义的是指针变量,编译器认为他们是用来访问内存的,因此编译器在优化代码的时候会把这个结果与4对齐
也就是(p2 - p1)/4,如果p2-p1小于4,除以4后则为0,如果大于4,除以4后则不为0
参考一下以下代码,理解一下:
- int main(void)
- {
- int b;
- char a;
- char *c = &a;
- int d;
-
- b = 1000;
- //变量是char型,实际上分配了4个字节,改变它相邻4个字节的值不会影响别的变量
- c[0] = 255;
- c[1] = 255;
- c[2] = 255;
- c[3] = 255;
- d = b;
- printf("d=%d\n",d);
- //继续改变4个字节之后的内容,将影响变量的b内容。
- c[4] = 255;
- c[5] = 255;
- c[6] = 255;
- c[7] = 255;
- d = b;
- printf("d=%d\n",d);
- return 0;
- }
复制代码