全局区的变量是否可以在任何函数内引用,修改值?多谢

全局区的变量是否可以在任何函数内引用,修改值?谢谢
#include <stdio.h>
#include <string.h>
int i1;
char s2[100],s3[100];
void afun(int p1,char *p2,char *p3) {
 printf("in afun:%d,%s,%s\n",p1,p2,p3);
}
int main() {
 i1=123;
 strcpy(s2,"I am s2");
 strcpy(s3,"I am s3");
 afun(i1,s2,s3);
 return 0;
}
我改成如下形式也可以啊,还有必要传入参数吗?
#include <stdio.h>
#include <string.h>
int i1;
char s2[100],s3[100];
void afun() {
 printf("in afun:%d,%s,%s\n",i1,s2,s3);
}
int main() {
 i1=123;
 strcpy(s2,"I am s2");
 strcpy(s3,"I am s3");
 afun();
 return 0;
}

------解决方案--------------------
可以,但在不同模块要用extern
------解决方案--------------------
引用:
Quote: 引用:

可以,但在不同模块要用extern

谢谢,啥意思啊?

意思是说如果你在别的.c文件用这个全局变量声明要加上extern,否则是重复定义
------解决方案--------------------
原则上可以,但不推荐使用
传入参数是可变的,你可以用一个函数先处理a数组,再处理b数组,而如果使用全局变量,那么这个函数就只能处理a数组
此外还有多线程等等其他的问题

根本原因是,如果你使用全局数组,那么这个函数就和这个数组绑定在一起了
编程的根本目标是管理复杂度,你这样不必要的关联越多,写大程序就越难写,至于初学者写的小程序,随便想怎么写就怎么写,但还是一开始就养成良好的习惯,以后的路才会顺一点
------解决方案--------------------


引用:
不是太理解你说的,啥是:“而如果使用全局变量,那么这个函数就只能处理a数组” ?
和 “如果你使用全局数组,那么这个函数就和这个数组绑定在一起了“ 该怎么理解”?


int i1;
char s2[200],s3[300];
afun(i1,s2,s3);
char t2[200],t3[300];
afun(i1,t2,t3);
afun(i1,t2,s3);
afun(i1,s2,t3);

------解决方案--------------------
函数的用途是为了重用代码,如果你这个afun不是将同一个算法应用到不同的数组,而是定死只做一种事情。可以不传参数,用全局变量实现。
因为你用参数,可以让afun处理b数组、c数组……如果没有参数,afun就只能执行一种行为,他就是这个意思。
------解决方案--------------------
可以是指你说的功能是可以这样实现的,但一般上别人都不这样写函数,因为这样写函数没有意义,你直接copy代码进main里面不是更好?函数本身就应该是独立的才用函数,如果函数内部用了全局变量这个函数就没有意义了。
------解决方案--------------------
你改過之後,afun();就具有局限性了,沒改之前,函數是根據傳入的參數printf的,這種寫法更好!