C语言中的变量

一.普通局部变量:局部变量无论是否静态均不允许同名,否则会出现error;当局部变量与全局变量同名时,依据就近原则进行判断。局部变量同名是指在复合语句的嵌套中,内层复合语句变量与外层复合语句变量同名,这样是允许的。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(int argc, char *argv[])
{
	int a = 0;
	static int a = 0;//error

	printf("%d\n", a);

	system("pause");
	return 0;
}

二.普通全局变量:全局变量无论是否静态都不允许同名,否则编译器会给出error。同名情况同上。但是需要注意的是,普通全局变量与外部声明的普通全局变量重名时,vs会报错,gcc会给出警告。

fun.c:
int a = 0;

test.c:
extern a;
int a = 20;

三.静态局部变量:只会定义一次,以后的定义,将自动忽略。要注意理解,静态变量所说的重定义是指在函数的多次调用中,而不是在一个函数体中定义多次。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
	static int a = 0;
	a++;
	static int a = 0;//error

	printf("%d\n", a);

	system("pause");
	return 0;
}

四.静态全局变量:静态全局变量只在当前源文件有效。当外部extern声明的外部全局变量与静态全局变量在同一源文件时,不会出现任何问题,程序能够正常运行。

  定义 作用范围 生命周期 内存区域 不初始化时变量的值
普通局部变量 {}内部 复合语句中离它最近的{}内 离他最近的大括号之间 栈区 内容随机
普通全局变量 函数外部 当前源文件和其他extern修饰的源文件 整个进程 堆区 0
静态局部变量 {}内部static修饰 离它最近的{}内 整个进程 堆区 0
静态全局变量 函数外部static修饰 当前源文件有效,不能被外部文件使用。 整个进程 堆区 0

猜你喜欢

转载自blog.csdn.net/Hello_MyDream/article/details/82670386