C语言-指针问题
今天在翻阅于正冲老师的《C语言深度剖析》(希望我没写错字。)的时候遇到了一个问题很不解。想提出来,请精通C语言的大神帮助理解一下。谢谢。我是用WIN7 64位系统VC6.0编译如下截图程序查看内存结果如下截图。
请问一下:
1-对于图中画红色线的地方怎么会是这种结果呢?
2-p1 和 (int *)(&a+1)的值不一样?p1直接指向了a数组的末端下一个int类型数,而后者指向了a[0]的第一字节。求解释额。。谢谢。。。 C 指针 地址
[解决办法]
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p1;
int *p2;
int *p3;
p1= a;//数组名可以做数组的首地址
p2 = a+1;//指向第‘1’个元素
p3 = (int *)(a+1);//指向第‘1’个元素
printf("%x, %x, %x, %d, %d\n", p1, p2, p3, sizeof(a), sizeof(a[0]));
p1= (int *)(&a +1);//数组首地址,再取地址,相当于指针的指针,相当于二维数据,+1,相当于加上sizeof(a)
//这一句相当于:
p1 = (int *)((int)a + sizeof(a));
//或者相当于
p1 = a + sizeof(a)/sizeof(a[0]);
p2 = (int *)((int)a+1);//把地址强制转换成整型数然后加1,把结果当做地址。。。。
p3 = (int *)(a+1);//第‘1’个元素
printf("%x, %x\n", p1[-1], *p2);
return 0;
}
和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
[解决办法]
单个数组名表示数组的首地址,&a是数组的地址,a是数组的首地址,&a+1相当于你就是走过一个数组的长度,a+1就是向后移动一位。犹如北京市是首都也是市政府
[解决办法]