c语言,求printf输出的值,急求!!

#include<stdlib.h>
#include<stdio.h>

int i=7;

void f(int l, int m, int *n, int *o)
{
int i;
i=10;
j=12;
l++;
m++;
(*n)++;
o++;
}

int main(){
int i=2,j=3,k=4,*p;
p=&j;
f(i,j,p,&k);
printf("%d%d%d%d",i,j,k,*p);
return(0);
}

答案是 2 4 4 4 ,求详细解释怎么得到这四个数的,谢谢!
按理说i,j都是进入f中都自加了1啊,为什么i不变而j变成4了??另外k,p也不懂

这是实参和形参的问题,形参的改变不影响实参。
也就是说,i 和 j 传进函数f里,这是值传递,就是把它们的副本传过去,实际main中的值没有改变,改变的是副本的值;等 f 函数结束时,副本的存储空间也会释放掉。而p和&k就是把指针传过去,即把地址传了过去,也就是说在函数 f 中可以对j (p指向j)和k做修改。追问

i我明白了,j进入f之后值不变我明白,但这时对j的处理不已经结束了么?后面对于p的++为什么还会影响到j呢?另外最后k进入f后0++,为什么o地址加1值还可以不变呢?本人菜鸟

追答

建议你先看看指针的知识:

下面我简单说说原因:p是指针变量,指向j,到这一步时:*n ++(即*p ++);也就是间接使j + 1了,退出定义函数f时,虽然p的空间会被释放,但它在*n ++
这不已经改变了j的值。
你要知道,主函数中传递过去的&k,这是是地址传递,系统会为形参开辟一个临时指针变量,然后把实参的地址传送给形参,也就是说形参n(副本)跟
main中的k的地址不同的,f函数返回时会释放掉;原来的k并没有改变

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-08
你只把i的值赋给了函数,所以i的值不变;而j是赋的地址,所以j变了。
关于k,你把k的地址赋给了函数的参数o,o是一个指向k的地址,所以”o++“只是地址值+1。追问

i我明白了,j进入f之后值不变我明白,但这时对j的处理不已经结束了么?后面对于p的++为什么还会影响到j呢?另外最后k进入f后0++,为什么o地址加1值还可以不变呢?本人菜鸟

第2个回答  2012-10-08
函数变改变参数值,所以i不变,且不是全局变量i=7,而是局部变量i=2.f函数中的j=12应改为l=12,p是j的地址,j作为参数进入f函数,值不变,但是要看p,即是f函数中的n,其值加1,所以导致j加1,也就是说*p和j都是4了,他们是相等的。最后K,其地址带入f函数,也就是o,o++使其地址加1,他的值不变,还是4
第3个回答  2012-10-11
你这个应该会报错的吧,f()里面的j没有声明啊,你f()里的int i;应该是 int j;吧?
相似回答