局部变量作用域仅限于函数中
当局部变量与全局变量发生冲突时,函数以局部变量为准。
在一个代码块中,比如:for, if的局部变量,这个变量的作用域就在此代码块中。
局部变量,系统不会默认对其进行初始化,全局变量会。指针的初始化是NULL
全局变量占用静态的存储单元,保存在内存的全局存储区中,局部变量保存在栈中
在同一个作用域,变量名不能重复。在更小的作用域,可以与稍大的作用域重复变量名
#include <stdio.h>
double price =200;
double price1 = 200;
void test01() {
printf("%d,%f\n", price, price1);
}
void test02() {
int price = 250;//重新声明了一个局部变量
price1 = 201;//并未重新声明,修改的是全局变量的price1的值
printf("%d, %f\n", price, price1);
}
void main() {
printf("price=%f\n", price);
test01();
test02();
test01();
}
C语言内存分布
- 栈
局部变量 - 堆
malloc(unsigned int size),动态分配的数据 - 静态存储区/全局区
全局变量
静态数据 - 代码区
存放代码
static关键字
变量
静态局部变量,编译器会对其进行初始化,为0
存储在静态存储区(全局性质)只会被初始一次,即使函数返回,它的值不变
普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用,但其它文件不能再定义重名的变量;静态全局变量仅对当前文件可见,其他文件不可访问,但是可以定义与其同名的变量。
在一个文件中使用另一个文件的全局变量,用extern来引入:extern int num;
定义不需要与其他文件共享的全局变量时,用静态全局变量
#include <stdio.h>
//void main() {
// static int n;//系统默认初始化为0
// }
void fn(void) {
int n = 10;
printf("n = %d, ", n);
n++;
printf("n++ = %d\n", n);
}
void fnStatic(void) {
static int n = 10;
printf("static n = %d, ", n);
n++;
printf("n++ = %d\n", n);
}
int main(void) {
fn();
fnStatic();
fn();
fnStatic();//再次调用后,static n已经初始化过,不会再进行初始化,也就是值会从11开始
return 0;
}
函数
在一个文件中使用另一个文件的函数,用extern来引入:extern int function(
static关键字修饰函数,函数便不能被其他文件引入static int function()
不同的文件可以使用相同名字的静态函数,互不影响。