在main
函数中有一个变量名为n
的变量,其值为0。而在函数func
中,也有一个变量名为n
的变量,并将其赋值为100。
函数main
中的变量n
始终为0,而函数func
中的变量n
被赋值为100。
通过结果看来,函数func
中的变量n
,与函数main
中的变量n
,并不是同一个变量。下面,让我们引入作用域的概念,更加明确地描述并解释这个现象。
首先,我们从代码块开始。
源代码中,被花括号包括的代码,形成一个代码块。
如果,我们在代码块A
中声明一个整型变量int n = 3
。看看编译器是怎样理解这条声明的。
- 编译器预留
sizoef(int)
字节的内存空间。 - 标识符
n
指代上述的内存空间。 - 标识符
n
为int
类型,用于规范所指代内存空间中数据的使用。
编译器看到这条声明之后,将会为我们预留4字节内存空间。技术上来说,在代码中可以使用这个空间的地址和空间大小来指代该空间。但是,这是汇编语言惯用的写法。而我们使用C语言,就是为了可以通过更方便的方式来操作内存。在C语言中,使用声明变量时的标识符n
来指代这个空间。此外,编译器还认为标识符n
为int
类型。当对n
做出一些不正常操作时,例如:将n
当做指针来使用,会报错或警告提示我们。
使用标识符n
来指代内存空间有一定的使用范围。若声明在代码块内,使用范围从变量声明开始,一直到包含声明的代码块结束。这一段使用范围被称之为标识符n
的块作用域。
块作用域有上下两个界限:
- 下界限:包含标识符声明的代码块结束
作用域外标识符n
没有意义。
对于上界限来说,在标识符n
声明前,无法使用标识符n
。这也是我们之前老生常谈的标识符先声明后使用的原则。
对于下界限来说,包含标识符声明的代码块结束后,标识符n
没有意义。因此,在代码块B
中,也无法使用标识符n
。
若在同一代码块中重复声明标识符n
,将出现标识符重定义报错。
第一条声明语句已经让标识符n
指代了一个数据对象了,它不能再去指代别的数据对象了。