C 采用全局变量解决调用函数参数问题和采用指针解决的区别
这里我用一个最简单的例子说明一下问题代码I:#include<stdio.h>#include<stdlib.h>voidswap(inta,intb)/*调运该函数进行...
这里我用一个最简单的例子说明一下问题
代码I:
#include <stdio.h>
#include <stdlib.h>
void swap(int a, int b)/*调运该函数进行交换无法达到目的*/
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int x,y;
x=0;
y=1;
swap(x,y);
printf("x=%d\ny=%d\n", x,y);
getchar();
system("pause");
return 0;
}
运行结果是:
x=0
y=1
这个我是理解的。
一般来说都是这么解决的,代码II:
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x,y;
x=0;
y=1;
swap(&x,&y);
printf("x=%d\ny=%d\n", x,y);
getchar();
system("pause");
return 0;
}
运行结果是:
x=1
y=0
这个我也是理解的。
好的现在我把程序I改成这样,程序III:
#include <stdio.h>
#include <stdlib.h>
int x,y;//全局变量
void swap(void)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main()
{
x=0;
y=1;
swap();
printf("a=%d\nb=%d\n", a,b);
getchar();
system("pause");
return 0;
}
运行结果是:
x=1
y=0
至于这个运行结果和程序II相同,这一点同样我也是理解的。
程序II和程序III,在原理上是不同的,我写嵌入式系统的作业特别喜欢使用全局变量,并把它们都声明在自定义的头文件当中,需要增加一个变量时就去修改那个头文件,由此来避免使用指针(此例),所有的自定义函数也都写成无返回值的形如void function(/*...*/)的形式。这种习惯容易产生什么后果呢?我个人觉得这样做十分清晰明了,管它什么参数不参数地址不地址的,比如此例我要对x,y进行操作,swap函数和主函数就都对x,y进行操作,省得一会a啊,b啊的,一会又是指针地址什么的,多麻烦,有什么不好的吗?
补充:不好意思,程序III的printf函数写错了,把a,b换成x,y 展开
代码I:
#include <stdio.h>
#include <stdlib.h>
void swap(int a, int b)/*调运该函数进行交换无法达到目的*/
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int x,y;
x=0;
y=1;
swap(x,y);
printf("x=%d\ny=%d\n", x,y);
getchar();
system("pause");
return 0;
}
运行结果是:
x=0
y=1
这个我是理解的。
一般来说都是这么解决的,代码II:
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x,y;
x=0;
y=1;
swap(&x,&y);
printf("x=%d\ny=%d\n", x,y);
getchar();
system("pause");
return 0;
}
运行结果是:
x=1
y=0
这个我也是理解的。
好的现在我把程序I改成这样,程序III:
#include <stdio.h>
#include <stdlib.h>
int x,y;//全局变量
void swap(void)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main()
{
x=0;
y=1;
swap();
printf("a=%d\nb=%d\n", a,b);
getchar();
system("pause");
return 0;
}
运行结果是:
x=1
y=0
至于这个运行结果和程序II相同,这一点同样我也是理解的。
程序II和程序III,在原理上是不同的,我写嵌入式系统的作业特别喜欢使用全局变量,并把它们都声明在自定义的头文件当中,需要增加一个变量时就去修改那个头文件,由此来避免使用指针(此例),所有的自定义函数也都写成无返回值的形如void function(/*...*/)的形式。这种习惯容易产生什么后果呢?我个人觉得这样做十分清晰明了,管它什么参数不参数地址不地址的,比如此例我要对x,y进行操作,swap函数和主函数就都对x,y进行操作,省得一会a啊,b啊的,一会又是指针地址什么的,多麻烦,有什么不好的吗?
补充:不好意思,程序III的printf函数写错了,把a,b换成x,y 展开
4个回答
展开全部
对于你个人开发来说,或许全局变量更加方便,但对于团队开发,全局变量是不被推荐的,函数的作用是用于封装一段功能,应该是独立的一段功能函数,过度依赖全局变量,一旦全局变量被意外修改会发生不可意料的错误,而且当你熟练运用指针你会发现它能给你带来许多便利,所以推荐你使用指针
更多追问追答
追问
主要还是对于大程序,变量多的时候容易产生问题,就好像一个班同学多了,容易张冠李戴是吗?那么对性能啊ROM啊等等影响怎么样呢?
追答
全局变量多了的确会难以维护
首先全局变量的生存周期是变量声明到程序结束,而作为参数的指针属于局部变量,生存周期仅是
函数运行到结束,想必也知道性能的差别
不过参数传递多了另外的开销,参数每次调用需要开辟内存,而全局变量省去了这些步骤,说到底各有各的好处,不过实质性能差别也是不大,对于维护性而言更推荐传参
展开全部
你这是代码比较少所以清晰,当代码量大的时候你就很麻烦的~
你的例:
#include <stdio.h>
#include <stdlib.h>
int x,y;//全局变量 ,全局变量导致所有函数都有可能会修改x和y的值,所以你在定义其他函数的 //时候每次都要注意不要定义和全局变量的名称一样,不然 可以编译,但不是你想要的结果
void swap(void)
{
int temp;
int x=5; /还有一种情况:这里的x会屏蔽全局的x,导致你不想要的结果
temp = x;
x = y;
y = temp;
}
int main()
{
x=0;
y=1;
swap();
printf("a=%d\nb=%d\n", a,b);
getchar();
system("pause");
return 0;
}
你的例:
#include <stdio.h>
#include <stdlib.h>
int x,y;//全局变量 ,全局变量导致所有函数都有可能会修改x和y的值,所以你在定义其他函数的 //时候每次都要注意不要定义和全局变量的名称一样,不然 可以编译,但不是你想要的结果
void swap(void)
{
int temp;
int x=5; /还有一种情况:这里的x会屏蔽全局的x,导致你不想要的结果
temp = x;
x = y;
y = temp;
}
int main()
{
x=0;
y=1;
swap();
printf("a=%d\nb=%d\n", a,b);
getchar();
system("pause");
return 0;
}
追问
主要还是对于大程序,变量多的时候容易产生问题,就好像一个班同学多了,容易张冠李戴是吗?对性能啊ROM啊等等影响怎么样呢?
追答
是的·~~因为代码不可能写一次就万事无忧 以后还要添加 还要修改~~
你就不知道之前的有没有定义,会不会产生影响。
性能和rom影响没听过~
全局的使用只是会担心造成对某些模块(函数)的影响
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当一个程序比较小时,使用的变量个数很少,这当然可行。但是当程序稍大一点时,就会发现要定义的变量太多,特别是一些循环控制变量、临时变量等,不知道此前是否已经使用;赋初值会否使以前的数据丢失;一不小心把前面有用的数据覆盖了的话,这种逻辑错误很难查找。特别是很多要使用局部变量的递归程序,就无法使用。
追问
能举个例子吗?不需要完整代码
追答
主程序:
for(i=0;i<1000;i++)
{
......
if(...)work1();
......
work2();
.....
}
void work1()
{
for(i=0;i<20;i++)
{....}
}
void work2()
{int i=0;
while(i<20)
{....}
}
就好像一个班同学多了,容易张冠李戴。
如果说从某年起不分班了,全校就一个班。那这样一、二千人就很容易重名。管理就不方便了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
32位Windows内存地址采用平坦结构,内存地址都是32位整数,而指针变量的实质就是内存地址。所以,不管哪一种类型的指针变量都是4个字节大小。
追问
我这里只是举一个例子,用VS2010只是把它当文本编辑器使用,编译环境是ARM V7,用的是keil的环境,这台电脑只有VS所以代码写成这样。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询