|
发表于 2005-8-6 11:42:50
|
显示全部楼层
详细地给你分析一下吧:
你这种结果纯粹是巧合。
1、首先做一下分析
b = a
c = &b
c = *(c + i)
则c = *(&b + i)
当i = 0时,c[0] = *(&b) = b =a 所以第一个输出为数组的首地址。
当i = 1时,c[1] = *(&b + 1) 这时候为什么输出1?
在程序中打印a、&b的地址(我在DEV-C++下运行)
/**********************************************/
#include <stdio.h>
int main(void)
{
int a[3]={0,1,2};
int *b;
int i;
int **c;
b=a;
c=&b;
for(i=0;i<3;i++)
printf("c[%d] = %d\n", i, c);
printf("a = %d\n", a);
printf("&b = %d\n", &b);
getch();
return 0;
}
/**********************************************/
得到 c[0] = 2293600
c[1] = 0
c[2] = 1
a = 2293600
&b = 2293596
不知你看出道理来了没:函数中按局部变量的声明顺序降序分配栈空间(数组升序),所以 a的栈空间在b之上。
回到刚才的:当i = 1时,c[1] = *(&b + 1) 这时候为什么输出1?
c[1] = *(&b + 1) = *(2293596(地址常量) + 1*4) = *(2293600(地址常量)) = a[0] = 0
这里乘4是因为&b的类型是地址,32位机中地址占4字节。
这样当i = 2时,c[2] = *(&b + 2) = 2就很正常了。
也可以解释
“然后我把i的范围确定为for(i=1;i<=3;i++),则结果是0,1,2!”这个问题了。
2、为什么这个结果是巧合?就是因为刚好b的栈空间刚好在a之下差4各字节。
若改变
int a[3]={0,1,2};
int *b;
的定义顺序为
int *b;
int a[3]={0,1,2};
结果恐怕就不会出现1 ,2了
“然后我把i的范围确定为for(i=1;i<=3;i++),则结果是0,1,2!”这样只怕也不行哦!!! |
|