首页 /  技术专区  /  C 宽屏模式 >

变量和函数的代码块作用域

1、变量和函数的作用域

1.1 什么作用域

就是变量和函数起作用的范围,只要在这个范围内,你就可以访问该变量和函数

作用域实际上有三种:

(1)局部变量的代码块作用域

(2)函数和全局变量的本文件作用域

(3)跨文件作用域 —— 链接域,与链接有关

前两种我们在本小节介绍,第三种我们放到“链接域”小节介绍。

1.2 局部变量的代码模块作用域

(1)什么是代码块

        其实有关代码块,我们在讲生命周期时就提到过。

那什么是代码块呢?

简单理解就是{}括起来的就是代码块,不要把代码块等价为函数,因为if、for、while等同样有{}这个东西。

(2)代码块作用域 的 范围

        从定义处到代码块结束。

(3)例子

int main(void)
{
    int a; //a的代码块作用域:从定义位置开始到main函数的}。
    {
        int b; //b的代码块作用域:定义位置开始到内部}。
        ...
    }
    ...
}

int b所在的内部{}实际上才是真正的代码块,只不过在广义上我们将所有带{}的都理解为代码块,当然结构体类型定义除外,虽然结构体类型的定义有{},但不是代码块。

struct student
{   //这个不是代码块
    int num;
    ...
};

(4)形参的作用域

        形参的作用域也是代码块作用域,不过有些特殊的地方需要说明下。



我们直接举例介绍。

int fun(int n, int buf[][n]) 
{
    ...
}

int main(void)
{
    int buf[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
    fun(4, buf);
}

n的作用域:定义位置开始,到参数列表末尾,再到fun的}

buf[][n]的作用域:定义位置开始,到参数列表末尾,再到fun的}

由于n的作用域覆盖了buf,所以才能在buf中使用n,如果反过来的话fun(int buf[][n],int n),编译时会提示buf中的n无法识别,因为buf不在n的作用域内。


头像
0/200
图片验证码