扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这是C中一个很典型的问题,传值和传地址值的区别:
十年的天桥网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整天桥建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“天桥网站设计”,“天桥网站推广”以来,每个客户项目都认真落实执行。
传值方式:
void jtf(float x0,float h,float a,float b),这样传的a和b就是传值,传参的时候会构造一个a和b的副本对象,在函数jtf中对a和b所做的任何操作都是对副本对象的操作,和原来的a b毫无关系,原来的a b的值不会改变。
传地址值方式:
float a, b;
void jtf(float x0,float h,float a,float b) - jtf(a, b); //引用
void jtf(float x0,float h,float* a,float* b) -jtf(a, b);//指针
使用引用和指针即是传地址值方式, 传递的是原来的a b的地址,在函数jff中所做的所有操作都是针对a b本身的.所做的改变也会保留.
很显然, 你的程序应该是用第二种方式的.
fz是否大于fm,大于则fm的值赋值给min,小于则fz赋值给min,这是三元运算符,建议巩固基础
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。
例如:
int f1(int a) /*函数f1*/
{
int b,c;
……
}
a,b,c有效
int f2(int x) /*函数f2*/
{
int y,z;
……
}
x,y,z有效
main()
{
int m,n;
……
}
m,n有效
在函数f1内定义了三个变量,a为形参,b,c为一般变量。在 f1的范围内a,b,c有效,或者说a,b,c变量的作用域限于f1内。同理,x,y,z的作用域限于f2内。m,n的作用域限于main函数内。关于局部变量的作用域还要说明以下几点:
1) 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
2) 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3) 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为n,是完全允许的。
4) 在复合语句中也可定义变量,其作用域只在复合语句范围内。
例如:
main()
{
int s,a;
……
{
int b;
s=a+b;
…… /*b作用域*/
}
…… /*s,a作用域*/
}
【例8.12】
main()
{
int i=2,j=3,k;
k=i+j;
{
int k=8;
printf("%d\n",k);
}
printf("%d\n",k);
}
本程序在main中定义了i,j,k三个变量,其中k未赋初值。而在复合语句内又定义了一个变量k,并赋初值为8。应该注意这两个k不是同一个变量。在复合语句外由main定义的k起作用,而在复合语句内则由在复合语句内定义的k起作用。因此程序第4行的k为main所定义,其值应为5。第7行输出k值,该行在复合语句内,由复合语句内定义的k起作用,其初值为8,故输出值为8,第9行输出i,k值。i是在整个程序中有效的,第7行对i赋值为3,故以输出也为3。而第9行已在复合语句之外,输出的k应为main所定义的k,此k值由第4 行已获得为5,故输出也为5。
8.8.2 全局变量
全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
例如:
int a,b; /*外部变量*/
void f1() /*函数f1*/
{
……
}
float x,y; /*外部变量*/
int fz() /*函数fz*/
{
……
}
main() /*主函数*/
{
……
}
从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。但x,y 定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用。
【例8.13】输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。
int s1,s2,s3;
int vs( int a,int b,int c)
{
int v;
v=a*b*c;
s1=a*b;
s2=b*c;
s3=a*c;
return v;
}
main()
{
int v,l,w,h;
printf("\ninput length,width and height\n");
scanf("%d%d%d",l,w,h);
v=vs(l,w,h);
printf("\nv=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);
}
【例8.14】外部变量与局部变量同名。
int a=3,b=5; /*a,b为外部变量*/
max(int a,int b) /*a,b为外部变量*/
{int c;
c=ab?a:b;
return(c);
}
main()
{int a=8;
printf("%d\n",max(a,b));
}
如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。
#include"stdio.h"
int main()
{int i,n;
float s=0;
scanf("%d",n);
for(i=1;i=n;i++)
if(i%2)s+=1.0/i;
else s-=1.0/i;
printf("%f\n",s);
system("pause");
return 0;
}
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域是整个源程序。例如:
int a, b; //外部变量
void f1(){
// Code
}
float x,y; //外部变量
int fz(){
// Code
}
int main(){
// Code
return 0;
}
int a, b; //外部变量
void f1(){
// Code
}
float x,y; //外部变量
int fz(){
// Code
}
int main(){
// Code
return 0;
}
a、b、x、y 都是在函数外部定义的全局变量。x、y 定义在函数f1之后,在f1内无效。a、b定义在源程序最前面,因此在f1、f2及main内都有效。
【示例】输入正方体的长宽高l、w、h。求体积及三个面x*y、x*z、y*z的面积。
#include stdio.h
int s1,s2,s3; // 面积
int vs( int a,int b,int c){
int v; // 体积
v = a*b*c;
s1 = a*b;
s2 = b*c;
s3 = a*c;
return v;
}
int main(){
int v,l,w,h;
printf("Input length,width and height: ");
scanf("%d %d %d",l,w,h);
v = vs(l,w,h);
printf("v=%d, s1=%d, s2=%d, s3=%d\n",v,s1,s2,s3);
return 0;
}
#include stdio.h
int s1,s2,s3; // 面积
int vs( int a,int b,int c){
int v; // 体积
v = a*b*c;
s1 = a*b;
s2 = b*c;
s3 = a*c;
return v;
}
int main(){
int v,l,w,h;
printf("Input length,width and height: ");
scanf("%d %d %d",l,w,h);
v = vs(l,w,h);
printf("v=%d, s1=%d, s2=%d, s3=%d\n",v,s1,s2,s3);
return 0;
}
运行结果:
Input length,width and height: 3 4 5
v=60, s1=12, s2=20, s3=15
设置四个变量左边界l,右边界r,上边界u,下边界d。每调用一次递归在二维数组中存一层数据,然后把l加1,r减1,u加1,d减1。lr为递归出口。代码如下:
#include stdio.h
int b[100][100];
void fz(int l,int r,int u,int d,int v,int n)
{
int x,y,i,j,k,m;
if(lr)
for (x=0;xn;x++)
{
for (y=0;yn;y++)
printf("%4d",b[x][y]);
printf("\n");
}
while(l=r)
{
for (i=l;i=r;i++) b[u][i]=v++;
for (k=u+1;kd;k++) b[k][r]=v++;
for (j=r;jl;j--) b[d][j]=v++;
for (m=d;mu;m--) b[m][l]=v++;
return fz(l+1,r-1,u+1,d-1,v,n);
}
}
int main()
{
int n;
scanf("%d",n);
fz(0,n-1,0,n-1,1,n);
return 0;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流