「C系列」C 作用域规则
文章目录
- 一、C 作用域规则
- 二、案例
- 1. 块作用域(Block Scope)
- 2. 文件作用域(File Scope)
- 3. 静态作用域(Static Scope)
- 静态局部变量
- 静态全局变量
- 4. 函数参数的作用域
- 5. 结构体和联合体的作用域
- 三、相关链接
一、C 作用域规则
在C语言中,作用域(Scope)是指程序中定义的变量和函数可以被引用的区域。理解作用域规则对于编写清晰、可维护的代码至关重要。以下是C语言中作用域规则的一些关键点:
- 块作用域(Block Scope):
- 在C语言中,花括号
{}
内的代码块定义了一个作用域。在这个作用域内声明的变量(包括使用static
关键字声明的变量)只能在该作用域内被访问。 - 局部变量(Local Variables)就是在函数体或代码块内部声明的变量,它们具有块作用域。
- 如果在函数内部或代码块内部使用了与外部变量同名的局部变量,则在该作用域内局部变量将覆盖外部变量。
- 文件作用域(File Scope):
- 在函数之外声明的变量(不使用
static
关键字)具有文件作用域。这些变量可以在声明它们的源文件的任何地方被访问,但不能被其他源文件直接访问(除非使用extern
关键字)。 - 全局变量(Global Variables)就是在函数外部声明的变量,它们具有文件作用域。
- 函数作用域(Function Scope):
- 实际上,C语言并没有专门的“函数作用域”概念。在C语言中,函数的参数只在函数体内部(即块作用域)有效。
- 原型作用域(Prototype Scope):
- 函数原型中的参数名只在函数原型内部有效,它们不参与作用域规则。这意味着你不能在函数体外部直接通过参数名访问函数参数。
- 静态作用域(Static Scope):
- 在C语言中,
static
关键字可以用于控制变量的作用域和生命周期。在函数内部,使用static
关键字声明的变量具有静态存储期,并且在程序执行期间只会被初始化一次。这些变量在函数外部是不可见的,但在函数内部具有块作用域,并且在函数调用之间保持其值。 - 在函数外部,使用
static
关键字声明的变量也具有静态存储期,但它们的作用域被限制在声明它们的源文件中。这意味着这些变量在该源文件的所有函数中都是可见的,但不能被其他源文件直接访问。
- 函数参数的作用域:
- 函数的参数在函数体内是可见的,并且其作用域是整个函数体。参数在函数体内部通过其名称进行访问。
- 结构体和联合体的作用域:
- 结构体和联合体中的成员变量在结构体或联合体内部具有块作用域。这意味着你可以通过结构体或联合体的实例(即结构体变量或联合体变量)来访问这些成员变量。
理解这些作用域规则有助于你编写更加清晰、可维护的C语言代码。在编写代码时,应尽量避免使用全局变量,因为它们可能会导致命名冲突和数据安全问题。相反,应该尽可能地使用局部变量和函数参数来传递数据。
二、案例
下面是一些详细的C语言作用域规则案例代码,用于说明不同作用域下的变量访问和可见性。
1. 块作用域(Block Scope)
#include <stdio.h>int main() {int block_scope_var = 10; // 块作用域变量,在main函数内部可见{int another_block_scope_var = 20; // 另一个块作用域变量,仅在此代码块内部可见printf("Inside block: %d\n", another_block_scope_var); // 可以访问}// printf("Outside block: %d\n", another_block_scope_var); // 错误:another_block_scope_var不可见printf("Outside block: %d\n", block_scope_var); // 可以访问return 0;
}
2. 文件作用域(File Scope)
#include <stdio.h>int file_scope_var = 30; // 文件作用域变量,在整个文件中可见int main() {printf("File scope var: %d\n", file_scope_var); // 可以访问return 0;
}// 如果在另一个源文件中,需要使用extern关键字声明该变量才能访问
// extern int file_scope_var;
3. 静态作用域(Static Scope)
静态局部变量
#include <stdio.h>void func() {static int static_local_var = 0; // 静态局部变量,只初始化一次,在函数调用之间保持值printf("Static local var: %d\n", static_local_var);static_local_var++;
}int main() {func(); // 输出: Static local var: 0func(); // 输出: Static local var: 1return 0;
}
静态全局变量
#include <stdio.h>static int static_global_var = 40; // 静态全局变量,只在当前文件中可见int main() {printf("Static global var: %d\n", static_global_var); // 可以访问return 0;
}// 在其他源文件中无法直接访问static_global_var,除非使用extern关键字并且知道其确切的声明
4. 函数参数的作用域
#include <stdio.h>void print_sum(int a, int b) {// a和b是函数参数,其作用域是整个函数体int sum = a + b;printf("Sum: %d\n", sum);
}int main() {print_sum(5, 3); // 调用print_sum函数,传递参数5和3// 在main函数中无法直接访问a和b,因为它们是print_sum函数的参数return 0;
}
5. 结构体和联合体的作用域
#include <stdio.h>typedef struct {int x; // 结构体成员变量,其作用域是整个结构体float y;
} Point;int main() {Point p = {1, 2.0f}; // 结构体实例p,可以访问其成员变量x和yprintf("Point x: %d, y: %f\n", p.x, p.y); // 访问结构体成员return 0;
}
这些案例代码涵盖了C语言中不同的作用域规则,并展示了如何在代码中使用它们。请注意,在尝试访问不可见的变量时,编译器会报错。
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C系列」C 简介
- 「C系列」C 基本语法
- 「C系列」C 数据类型
- 「C系列」C 变量及常见问题梳理
- 「C系列」C 常量
- 「C系列」C 存储类
- 「C系列」C 运算符
- 「C系列」C 判断/循环
- 「C系列」C 函数
相关文章:
「C系列」C 作用域规则
文章目录 一、C 作用域规则二、案例1. 块作用域(Block Scope)2. 文件作用域(File Scope)3. 静态作用域(Static Scope)静态局部变量静态全局变量 4. 函数参数的作用域5. 结构体和联合体的作用域 三、相关链接…...

【机器学习基础】Python编程10:五个实用练习题的解析与总结
Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机…...
【设计模式】结构型设计模式之 门面模式
介绍 门面模式(Facade Pattern)是一种常用的设计模式,属于结构型模式的范畴。它为子系统中的一系列接口提供一个简化的统一接口,即一个外观(Facade),从而使子系统更加容易使用。门面模式并不修…...
MAC地址简介
一、MAC和ip地址 很多同学只知道ip地址,同时也知道ip在网络通讯中的重要性,实际上要实现网络通信的话,除了ip地址外还需要MAC地址的配合,只有在这两种地址的配合之下才能完整的实现互联网的通信。但是由于MAC地址的使用࿰…...
五种网络IO模型
目录 前言 文件描述符 为什么要多种io模型 同步IO 1.阻塞IO 2.非阻塞IO 3.多路复用IO(事件驱动IO) select: poll: epoll: 4.信号驱动IO 异步IO 区别 前言 文件描述符 首先我们了解一下文件描述符是什么:…...

VSCode超过390万下载的请求插件
Thunder Client 是一款在 VSCode(Visual Studio Code)中非常受欢迎的 REST API 客户端插件,由Ranga Vadhineni开发,现在已经有超过390万的下载量。它允许开发者直接在编辑器内发送 HTTP 请求,查看响应。Thunder Client…...
前端 JS 经典:下载的流式传输
触发下载在浏览器中有两种方式:1. 客户端的方式 2. 服务器的方式 1. 服务器的方式 通过 a 元素链接到一个服务器的地址,然后需要后端人员配置,当用户点击按钮请求这个地址时,服务端给他加上一个响应头。Content-Disposition 设置…...

k8s面试题大全,保姆级的攻略哦(三)
目录 1、简述ETCD及其特点? 2、简述ETCD适应的场景? 3、简述什么是Kubernetes? 4、简述Kubernetes和Docker的关系? 5、简述Kubernetes中什么是Minikube、Kubectl、Kubelet? 6、简述Kubernetes常见的部署方式? 7、简述Kubernetes如何实现集群管理? 8、简述Kubern…...

从年金理论到杠杆效应,再到财务报表与投资评估指标
一、解释普通年金终值和普通年金现值的概念。 普通年金终值:以利率为1%,每期收款100元,5期为例,普通年金终值的折算过程如图: 普通年金现值:以利率为1%,每期收款100元,5期为例&am…...

K8S - 用kubectl远程访问内网的k8s集群
在之前的文章 K8S - 在任意node里执行kubectl 命令 介绍过, 通过任何node 的主机, 用kubectl 管理集群是很简单 无非就是两个步骤: 下载 k8s master 上的admin.conf在当前主机配置 K8SCONFIG 环境变量指向 下载的config file 其他内网主机也适用 其…...

STM32F103C8移植uCOSIII并以不同周期点亮两个LED灯(HAL库方式)【uCOS】【STM32开发板】【STM32CubeMX】
STM32F103C8移植uC/OSIII并以不同周期点亮两个LED灯(HAL库方式)【uC/OS】【STM32开发板】【STM32CubeMX】 实验说明 将嵌入式操作系统uC/OSIII移植到STM32F103C8上,构建两个任务,两个任务分别以1s和3s周期对LED进行点亮—熄灭的…...

【c语言】qsort函数及泛型冒泡排序的模拟实现
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C语言 目录 一、qsort函数 1.回调函数 2.qsort函数 3.void* 指针 二、泛型冒泡排序的模拟实现 1.比较函数的编写 2.交换函数的编写 3.冒泡排序的编写 4…...

MySQL之多表查询—表子查询
一、引言 上一篇博客学习了行子查询。(看弹幕:同一张表用or,不同张表用union) 下面接着学习子查询当中的最后一种——表子查询。 表子查询 1、概念 子查询返回的结果是多行多列,这种子查询称为表子查询。 2、常用的操作符 IN 3、…...
Java 18风暴来袭:解锁编程新纪元
一、引言 Java 18的发布标志着Java语言在性能、安全性和开发效率方面的又一次飞跃。本次更新不仅带来了新的语言特性,还包括了一些实验性功能和工具的改进。这些新特性旨在帮助开发者编写更高效、更安全的代码,并提升开发体验。 二、新特性概述 1. 默…...

文件操作(Python和C++版)
一、C版 程序运行时产生的数据都属于临时数据,程序—旦运行结束都会被释放通过文件可以将数据持久化 C中对文件操作需要包含头文件< fstream > 文件类型分为两种: 1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2. 二进制文件- 文件以文本的二进…...

Git【版本控制命令】
02 【本地库操作】 1.git的结构 2.Git 远程库——代码托管中心 2.1 git工作流程 代码托管中心用于维护 Git 的远程库。包括在局域网环境下搭建的 GitLab 服务器,以及在外网环境下的 GitHub 和 Gitee (码云)。 一般工作流程如下: 1.从远程…...

打字侠是一款PWA网站,如何下载到电脑桌面?
嘿,亲爱的键盘侠们! 你是否还在为寻找一款好用的打字练习工具而烦恼?别担心,今天我要给大家介绍一位超级英雄——打字侠!它不仅是一个超级酷的打字练习网站,还是一款PWA(渐进式网页应用&#x…...
Scikit-learn使用步骤?使用场景?
Scikit-learn(简称sklearn)是Python中一个非常流行的机器学习库,它提供了广泛的机器学习算法和工具,用于数据分析、特征工程、模型训练、模型评估等任务。以下是一个关于sklearn的基础教程,内容将按照几个主要部分进行…...

MySQL 5.7详细下载安装配置教程(MySQL 5.7安装包)_mysql5.7的安装教程
记录MySQL 5.7 的下载安装教程,并提供了Mysql 安装包 ,以下是详细下载安装过程。 一、下载Mysql安装包 网盘下载: 下载MySQL 5.7安装包,网盘下载地址:点击此处直接下载 官网下载: 进入官网,…...

电阻十大品牌供应商
选型时选择热门的电阻品牌,主要是产品丰富,需求基本都能满足。 所所有的电路中,基本没有不用电阻的,电阻的选型需要参考阻值、精度、封装、温度范围,贴片/插件等参数,优秀的供应商如下: 十大电…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...