这几天重新复习了一下指针,无意中发现vc6一调试bug
看下面这段程序
#include<stdio.h>
void main() {
int a[3][3] = {1,2,3,4,5,6,7,8,9};
printf("%x\n",&a);
printf("%x",&a+1);
}
int a[3][3]={1,2,3,4,5,6,7,8,9},&a其值是数组的首地址不是数组首元素的首地址(虽然它和首元素的首地址相同),&a的类型是int (*)[3[3],所以当&a+n时,实际是按照&a(计算的过程中把&a认为是地址值,是个无符号整型变量啦,不再考虑它的类型啦)+n*sizeof(a),来得到的新地址(也是无符号整型变量),这个新地址肯定是数组a的界外,计算结果的类型还是 int (*)[3][3]。其中sizeof(a)是代表数组占的内存大小(就是数组a所有元素占的总字节数)。
对指针稍微有点理解的朋友就知道结果:
没错结果是:
12ff24 (&a)
12ff48 (&a+1)
即12ff24+1*36
当我在调试时意外的发现:
二话不说附图:
这里的&a+1的地址值只加了1
我思考这个问题:&a+1即为(&a)+1,注意:&(a+1)不是左值,无法进行显示
最后在vs2008测试,微软修正了这个问题: