首先来看下面一个简单的代码,程序和生活一眼个,其实里面很多都不是我们想象的那样执行的,的知道它里面的工作方式:
#include <stdio.h>
int main()
{
char c1;
char c2;
printf("%p\n",&c1); //0012ff44
printf("%p\n",&c2); //0012ff40
return 0;
}
从上面的例子我们可以看出,输出的地址为什么,c2的地址会比c1的小呢,不应该是先给c1分配吗?
但是我相信很多人也都了解了其中的原因了,这确实是个小问题!
我们都知道自动变量和静态变量都是局部变量,这是相同点。
不同的是,自动变量在函数每次运行的时候都要被重新创建,函数结束的时候,这些自动变量所占空间也被自动收回。
而静态变量它不会随着函数的调用和退出发生变化的,也就是说,在上次调用函数的时候如果我给静态变量赋了某个值的话,下次调用该函数的时候, 这个值将保持不变。
自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储空间,函数调用结束后立即释放。它分配内存的空间的时候是以栈的方式分配的。
c1进入后压栈,然后再进入c2,没有变量了,就为c2分配空间,然后c1,所以导致c1的地址小于c2@!!
顺便说一句因为我的电脑测试为小端,否则结果可能相反。
再来看下面一道题:
#include <stdio.h>
int main()
{
int b=3;
int arr[]={6,7,8,9,10};
int *p=arr;
*(p++)+=123; //*p=*p+123=arr[0]=129
printf("%d,%d\n",*p,*(++p)); //8,8
return 0;
}
从上面的结果看:为什么不是:7,8,而是8,8,呢,其实道理很简单,printf()函数的工作方式就是,从右往左,以栈的方式来工作的!
其实这些小问题只要弄清工作方式就不会错了!