该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
float main()
{
int x=2,y=3,z=0;//定义并赋值
printf("(1)x=%d y=%d z=%d\n",x,y,z);//打印出最初各变量的初值
ty(x,y,z);//调用函数,并通过值传递方式传递参数,实际上就是复制了一份参数的值过去给被 调函数
printf("(4)x=%d y=%d z=%d\n",x,y,z);//由于被调函数没有返回值,因此此处的xyz的值仍然是你最初赋的值,你可以值么理解,这三个变量的值至此都没被修改过,只被复制过一次
return (0);//这句就不解释了,但一般是return 0,并且是main()的返回值是int,从严谨的角度来说,可以钻研一下这该怎么写。
}
ty (int x,int y,int z)//函数的定义,严格上来说,如果不返回值,最好带个void(c99定义看多了的人,有强迫症。。。莫怪)
{
printf("(2)x=%d y=%d z=%d\n",x,y,z);//打印一次传过来的值,也就是从main函数内复制过来的
z=x+y;
x=x*x;
y=y*y;//以上三行为对三个数的修改,此时千万要记住,这里的xyz在内存中跟main函数内的xyz完全是不同的三个变量,你在此修改这三个变量,完全不会影响main函数内的xyz的值。
printf("(3)x=%d y=%d z=%d\n",x,y,z);//打印修改后的三个值,执行到这,调用就算结束,直接返回到printf("(4)x=%d y=%d z=%d\n",x,y,z);这句继续执行,所以这句打印出来的是你最开始赋的值。。。
哎,累死了~!不知道解释清楚了没。
当然,你可以这样
float main()
{
int x=2,y=3,z=0,*px,*py,*pz;//此处多定义三个整形指针
*px=&x;
*py=&y;
*pz=&z;//分别把地址付给对应的指针
printf("(1)x=%d y=%d z=%d\n",x,y,z);//main函数内第一次打印三个值,值未作改变
ty(px,py,pz);//调用函数,并把指针作为参数传给ty()
printf("(4)x=%d y=%d z=%d\n",x,y,z);//第四次打印,打印修改后的三个值
return (0);
}
ty (int *x,int *y,int *z)
{
printf("(2)x=%d y=%d z=%d\n",*x,*y,*z);//第二次打印三个值,值未作改变
*z=*x+*y;
*x=(*x)*(*x);
*y=(*y)*(*y);//根据三个地址,修改对应的参数值
printf("(3)x=%d y=%d z=%d\n",*x,*y,*z);//第三次打印,打印修改后的三个值
}
指针传递的是地址,无论这个地址对应的是多大的内存块,好处就是快,飞快。值传递跟参数传递其实都是方法,各有适用场景,大多数情况下用参数传递多,毕竟用一个指针就搞定了。