c语言静态变量的一道题

明白了呵~还有一道,静态变量的不明白这种算法怎么回事,输出5,9能分解的给我讲讲么?辛苦啦,我会追分的
#include<stdio.h>

int f(int m)
{
static int k=2;
k++;
return k+m;
}
void main( )
{
int s;
s=f(2);
printf("%d, %d\n", s, f(s));
}
输出5,9能细细的讲一下么

所谓静态变量就是说该变量的空间并非在动态内存区域开辟,而在静态内存区域开辟,也就是说这个变量空间一经分配除非整个程序运行完,这个变量的空间才会被收回。即便是在子函数中定义的,无论你调用过多少次,那个初始化的语句(static int k=2)仅仅在第一次调用时执行,随后都跳过不执行。也就是说,
#include<stdio.h>

int f(int m)
{
static int k=2;//只在首次调用时执行,之后调用函数均跳过。
k++;
return k+m;
}
void main( )
{
int s;
s=f(2);//第一次调用后K=3,这个变量不会被收回,继续保持,直到整个程序结束,s=3+2
printf("%d, %d\n", s, f(s));//第二次调用时后,K=4,f(s)=f(5)=5+K=5+4=9
}
简单的描述了下,希望对你有所助益。
补充一下,其实无论什么样的类似的问题,只要针对静态变量,请记住1,变量空间一经开辟就一直保持不被收回。2,其赋初值的语句(初始化)仅会执行一次。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-06
s=f(2);
这条语句:2作为实参传递给函数f(),即此时m=2,然后k本身是2,k++后则K=3;函数return k+m;
则s=5;
f(s);
(应为K为静态数据,所以程序执行期间K不会被摧毁,一直保持K的原值,即k=3;)
s作为实参,s=5(上面计算出来了),k=3,然后k++之后,k=4,函数返回s+k=5+4=9;

hehe,希望有帮助,加油!追问

真心谢谢呵`
main( )
{
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int i, j;
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
printf("%d, ", *(*(   )+ ));
printf("\n");
}
}
空里应该填a+i j 可是为什么不能运行呢?还有这段代码说是二维数组中变量的访问及其地址的计算,可我不是很明白其中的意义,我会追分的`辛苦了

追答

你填的是对的,没有错,hehe!
这个2维数组的需要掌握 行指针与列指针的概念!
你可以把2维数组看成是个 元素是数组的数组,这样的话,可能比较好理解
你还记得吗?数组名是可以隐式转换成指针的,如一维数组int a[5],int *p=a;//这个就是数组名转换成指针咯;
二维数组嘛,int array[3][4]则可以int (*ptr)[4]=array;//这里不能array=ptr,记住哈!
还有sizeof(a[0])=4(4为int机器字节),sizeof(array[0])=4*4=16(4为array[0]中的数组有4个元素,另一个4为int机器字节) 呵呵,不知道看到这里你看没看懂...
呵呵,那我现在来讲讲*(*(a+i)+j)的意思吧:
a+i 表示的是行指针,即指的是 第a+i行
*(a+i)+j表示是列指针,即指的是 第a+i行第j个(列)的元素
*(*(a+i)+j) 表示是 对指定的元素进行解引用,获取该元素的值
不知道你说的不能运行是不是应为没有#include 还是你复制时复漏了...

呵呵 我水平有限就这些啦,希望对你有帮助哈!

追问

讲的很明白,真心感谢呵
int main(void)
{
int a[5]={1,2,3,4,5};
int *p=a;
printf("%d,%d,%d,%d\n",*p++,(*p)++,++(*p),*p);
getch();
return 0;
}
怎么理解这段代码
*p++,(*p)++,++(*p),*p分别什么意思呢?辛苦啦

追答

这个输出我是不能确定啦,hehe,应为printf("%d,%d,%d,%d\n",*p++,(*p)++,++(*p),*p);这个表达式的求值顺序不能确定,所以不同机器上运行结果不同...
那我就讲讲 *p++,(*p)++,++(*p),*p 的意思吧
首先,先讲一下,*的优先级比++后者--低,还有就是()能强制优先
p指向数组a,则*p++的执行是,先对p进行解引用,然后p++,即p指向数组下一位
(*p)++,则执行的是先对p进行解引用,然后再对解引用后的值进行自增1,指针没有移动
++(*p),和上面一条含义一样,只是++方式不同了,对解引用后的值进行自增1,指针没有移动
*p表示直接解引用...

呵呵,就这些了!
我推荐一本书吧,谭浩强的《C程序设计》,讲的很好,不过就是浅了点,对初学者很有帮助!
希望对你有帮助,哈哈@

本回答被提问者采纳
第2个回答  2012-02-06
首先求s=f(2)进入调用函数,初始k=2,自家一次,此时,k=3,return k+m=2+3=5,输出s值为武5,再求f(s),因为s=5,即求f(5)的值,进入调用函数,静态变量k保持上次值是3,执行自加一次后k=4,因为形参m传递的是上次s的值5,所以return k+m=4+5=9追问

懂了,谢谢了呵
main(){
int x=2,y=-1,z=2;
if(x<y)
if(y<0) z=0;
else z+=1;
printf("%d\n",z);
}
输出为什么是2?
void main()
{ int i;
for(i=0;i<3;i++)
switch(i)
{ case 0:printf("%d",i);
case 2:printf("%d",i);
default:printf("%d",i);
}
}
输出为什么是000122

我会追分的,辛苦了,真心感谢

第3个回答  2012-02-06
看看!!
第4个回答  2012-02-06
还会被删吗?不删我就回答
相似回答