首页 > 其他分享 >重回C语言之老兵重装上阵(五)C语言作用域规则

重回C语言之老兵重装上阵(五)C语言作用域规则

时间:2025-01-14 14:29:19浏览次数:3  
标签:重装 生命周期 函数 作用域 globalVar C语言 int 变量

C 语言中的作用域(Scope)定义了一个变量或函数名可以被访问的范围。作用域规则帮助我们了解变量和函数在代码中有效的区域。C 语言中的作用域主要分为两类:变量作用域函数作用域

1. 作用域的类型

C 语言的作用域主要可以分为以下几种类型:

  • 块作用域(Block Scope):在代码块 {} 内部的作用域。
  • 函数作用域(Function Scope):用于函数参数的作用域。
  • 文件作用域(File Scope):在源文件内定义的全局变量和全局函数的作用域。
  • 外部作用域(External Scope):外部声明的作用域。

1.1 块作用域(Block Scope)

块作用域是最常见的作用域类型,指的是在函数或代码块(由 {} 包围的代码段)内定义的变量。它们仅在该块内部有效,在块外部不可见。

  • 声明与访问:变量在声明它们的代码块内有效,并且只能在该块内访问。
  • 生命周期:变量的生命周期持续到所在代码块执行完毕。
#include <stdio.h>

void func() {
    int a = 10;  // 变量 a 在 func() 的块作用域内有效
    if (a > 5) {
        int b = 20;  // 变量 b 在 if 语句的块作用域内有效
        printf("b = %d\n", b);  // 可以访问 b
    }
    // printf("%d\n", b);  // 错误:变量 b 不在作用域内
}

1.2 函数作用域(Function Scope)

函数作用域通常指函数的参数。函数参数在整个函数内有效,可以在函数体中的任何地方访问。

  • 声明与访问:函数参数在函数的整个范围内有效。
  • 生命周期:参数的生命周期在函数执行期间存在。
#include <stdio.h>

void printSum(int a, int b) {  // a 和 b 具有函数作用域
    printf("Sum = %d\n", a + b);
}

int main() {
    printSum(10, 20);  // 传入参数 a = 10, b = 20
    return 0;
}

1.3 文件作用域(File Scope)

文件作用域是指变量和函数在整个源文件内有效。文件作用域的变量或函数在文件的任何位置都可以访问,直到文件结束。

  • 声明与访问:文件作用域内的变量和函数从定义它们的位置开始,到文件末尾为止都有效。
  • 生命周期:文件作用域内的全局变量和函数在程序运行期间存在。
#include <stdio.h>

int globalVar = 100;  // 文件作用域变量

void func() {
    printf("globalVar = %d\n", globalVar);  // 可以访问 globalVar
}

int main() {
    func();
    printf("globalVar in main: %d\n", globalVar);  // 也可以访问 globalVar
    return 0;
}

1.4 外部作用域(External Scope)

外部作用域主要用于跨文件访问全局变量和函数。通过 extern 关键字声明外部变量,使得其他文件能够访问当前文件中定义的全局变量或函数。

  • 声明与访问:在其他文件中使用 extern 关键字来声明外部变量或函数。
  • 生命周期:与文件作用域变量相同,跨文件的外部变量具有全程序生命周期。
// file1.c
int globalVar = 50;  // 文件作用域变量

// file2.c
extern int globalVar;  // 声明外部变量

void printVar() {
    printf("globalVar in file2: %d\n", globalVar);  // 可以访问 file1.c 中的 globalVar
}

2. 作用域与生命周期的关系

在 C 语言中,作用域和生命周期是两个不同的概念:

  • 作用域:指变量或函数名在程序中有效的范围,即你可以在代码中的哪些地方访问该变量或函数。
  • 生命周期:指变量或函数在内存中存在的时间段,即从分配内存开始到销毁内存结束的时间。

例如:

  • 局部变量的生命周期是函数调用时开始,到函数结束时销毁;它们的作用域仅限于函数或代码块内部。
  • 全局变量的生命周期是从程序开始运行到程序结束,但它们的作用域仅限于声明它们的文件,除非通过 extern 关键字访问。

3. 作用域规则总结

作用域类型适用范围变量/函数的生命周期示例代码
块作用域局部代码块(函数或语句块)局部变量,函数调用期间有效int x;
函数作用域函数参数函数执行期间有效int foo(int x)
文件作用域文件内程序运行期间有效int globalVar;
外部作用域跨文件程序运行期间有效extern int var;

4. 注意事项

  1. 变量遮蔽(Variable Shadowing):如果一个局部变量的名字与外部变量或全局变量的名字相同,局部变量会遮蔽全局变量。在局部作用域内,优先访问局部变量。

    int x = 10;  // 全局变量
    void func() {
        int x = 20;  // 局部变量,遮蔽了全局变量
        printf("Local x = %d\n", x);  // 输出局部变量 x 的值
    }
    
  2. 静态变量(Static Variables):声明为 static 的局部变量其生命周期会超出函数的调用,但它的作用域仍然局限于函数内。

    void func() {
        static int x = 0;  // 静态变量,值在多个函数调用之间保持
        x++;
        printf("x = %d\n", x);
    }
    

标签:重装,生命周期,函数,作用域,globalVar,C语言,int,变量
From: https://blog.csdn.net/m0_73756108/article/details/145124286

相关文章

  • 重回C语言之老兵重装上阵(四)vscode配置C语言多文件编译运行
    眨眼睛第一次使用vscode写C语言多文件项目发现插件默认配置只能单文件编译,勃然大怒,于是怒了一下首先明确这一件事,只要有环境C文件就能通过命令行编译,插件只是简化输入命令行的工具,所以我们只需修改插件编译的配置即可一.首先我们需要下载对应插件点击跳转具体插件安装......
  • 大学生一站式C语言
    本文是对菜鸟教程的总结与学习经验window环境配置VisualStudio是由微软公司开发的集成开发环境(IDE),被广泛用于开发各种应用软件,包括桌面程序、网站、移动应用程序等。它提供了一整套开发工具和服务,包括代码编辑器、调试器、版本控制工具等,可以为开发者提供高效、流畅的编......
  • 14. C语言 指针(深入理解)
    本章目录:前言:什么是指针?内存与地址:指针的基础指针的声明与使用指针变量的声明指针与地址的关系空指针与野指针空指针(NULLPointer)野指针(DanglingPointer)指针进阶:从数组到函数指针与数组指针数组指向指针的指针函数指针指针的算术运算常见错误与调试技巧总结前......
  • 15. C语言 函数指针与回调函数
    本章目录:前言什么是函数指针?定义声明方式函数指针的基本用法示例:最大值函数输出示例:回调函数与函数指针什么是回调函数?通俗解释示例:回调函数实现动态数组填充输出示例:进一步探索:带参回调函数输出示例:函数指针的进阶技巧函数指针数组返回函数指针的函数输出示例:......
  • 《ESP32-S3使用指南—IDF版 V1.6》第二章 常用的C语言知识点
    第二章常用的C语言知识点1)实验平台:正点原子DNESP32S3开发板2)章节摘自【正点原子】ESP32-S3使用指南—IDF版V1.63)购买链接:https://detail.tmall.com/item.htm?&id=7684993426594)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html......
  • C语言初阶习题(2分支语句和循环语句-for)【10】杨辉三角
    1.题目描述——在屏幕上打印杨辉三角。2.思路第一步先尝试打印下三角第二步,分析他们之间的关系3.代码实现#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ intn=0; scanf("%d",&n); intarr[100][100]={0}; inti=0; in......
  • C语言初阶习题【27】猜名次
    1.题目描述5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。2.思路3.代码实现#include<stdio.h>in......
  • c语言——【linux】多线程编程 (内附练习及代码)
    1:开启一个线程主线程中:使用标准IO,向一个文件中写入任意数据分支线程:使用标准IO,读取该文件中的数据#include<stdio.h>#include<string.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<p......
  • 高阶C语言|探索指针的根源之目(进阶指针)
    文章目录前言1.字符指针(`char*`)1.1字符串常量与指针1.2字符指针的使用2.数组指针与指针数组2.1指针数组2.2数组指针3.数组与指针传参3.1一维数组传参3.2二维数组传参4.函数指针(`functionpointer`)4.1函数指针的基本用法4.2使用函数指针数组5.指向函数指......
  • C语言-循环结构
    循环结构:重复执行代码1、for循环    循环用于在知道循环次数的情况下使用。三个部分:初始化、条件判断和更新    基本形式:                    嵌套循环:                2、while循环        循环在......