版权声明:共享知识,欢迎转载 https://blog.csdn.net/kakiebu/article/details/82835236
1. 什么是局部变量与全局变量
在某一个块,指大括号对或者小括号对,定义的变量成为局部变量,离开这个范围就释放。
在外面定义的变量成为全局变量,要先声明后使用。
2. extern 声明全局变量
用extern 声明全局变量,但是再别的地方定义,甚至可以在别的文件中定义。
extern char w[7][10];
这就解决了上次局部变量回传的问题,a文件可以调用
a.c
#include<stdio.h>
extern char w[7][10];
int main(){
printf(“%s\n”, w[3]);
return 0;
}
b.c
char w[7][10] = {“aaa”, “bbb” …};
3. static 关键字限制变量只能够在定义的文件中使用
static 关键字限制变量只能够在定义的文件中使用,这样a文件就不能够调用了,第一次初始化时分配空间,一直保留,直至程序结束,空间就释放,a文件无法调用b文件的内容
a.c
#include<stdio.h>
extern char w[7][10];
int main(){
printf(“%s\n”, w[3]);
return 0;
}
b.c
static char w[7][10] = {“aaa”, “bbb” …};
4. 通过函数的方式解决static的限制问题
a.c
#include<stdio.h>
//extern char w[7][10];
cahr * week(int n);
int main(){
printf(“%s\n”, week(3));
return 0;
}
b.c
static char w[7][10] = {“aaa”, “bbb” …};
char * week(int n){
return w[n];
}
5. 利用字符串函数修改返回结果
a.c
#include<stdio.h>
//extern char w[7][10];
cahr * week(int n);
int main(){
strcpy(week(3), “hhhh”);
printf(“%s\n”, week(3));
return 0;
}
b.c
static char w[7][10] = {“aaa”, “bbb” …};
char * week(int n){
return w[n];
}
6. 解决办法
上面的情况明显不安全,因此需要限制函数的使用范围 同样用static
a.c
#include<stdio.h>
//extern char w[7][10];
cahr * week(int n);
int main(){
strcpy(week(3), “hhhh”);
printf(“%s\n”, week(3));
return 0;
}
b.c
static char w[7][10] = {“aaa”, “bbb” …};
static char * week(int n){
return w[n];
}
之前弄的变量无法回传的问题解决办法第二种
#include <stdio.h>
char * week(int n){
static char w[7][10] = {“aaa”, “bbb” …};
return w[n];
}
int main(){
printf(“%s”, week(4));
return 0;
}
7. 其他
全局变量和静态局部变量,如果没初始化系统会自动初始化为0.
8. register
register 寄存器,是CPU自带的存储空间,访问速度会比内存快很多。注意,这里是请求,会不会被批准不好说。
register int a;
9. volatile
他修饰的变量随时可能被莫名其妙的修改。多线程或者外界硬件的操作所致