【C语言】static关键字的使用

news2024/10/4 18:54:57

目录

一、静态本地变量

1.1 静态本地变量的定义

1.2 静态本地变量和非静态本地变量的区别

二、静态函数

2.1 静态函数的定义

2.2 静态函数与非静态函数的区别

三、静态全局变量

3.1 静态全局变量的定义

3.2 静态全局变量和非静态全局变量的区别

四、静态结构体变量 

4.1 静态结构体变量

4.2 静态结构体变量与非静态结构体变量

4.3 题外话


一、静态本地变量

1.1 静态本地变量的定义

静态本地变量是指在函数或方法内部定义的变量,在每次函数或方法被调用时都会保持其值的持久性。静态本地变量与普通本地变量的不同之处在于它们只会被初始化一次,并且在函数或方法的不同调用之间保持其值不变。

1.2 静态本地变量和非静态本地变量的区别

1.初始化

静态本地变量在没有显式初始化的情况下,默认会被设置为0。

非静态本地变量在没有显式初始化的情况下,其成员变量的值默认情况下是未定义的,即不会自动被赋值为0。

2.作用域(这里可以类比静态本地变量与非静态本地变量)

静态本地变量count1在每次函数调用之间保持其值。

非静态本地变量count2在每次函数调用时都是新创建的,其值不会保持一致。

#include <stdio.h>

void counter() {
    static int count1; // 静态本地变量
    count1++;

    int count2=0; // 非静态本地变量
    count2++;

    printf("Count1: %d,", count1);
    printf("Count2: %d\n", count2);
}

int main() {
    counter(); 
    counter(); 
    counter(); 

    return 0;
}


二、静态函数

2.1 静态函数的定义

在函数声明前使用static关键字,将该函数声明为静态函数。静态函数只能在当前.c文件中使用,不能被其他.c文件中的函数调用。

#include <stdio.h>

// 静态函数
static int add(int a, int b) {//静态函数
    return a + b;
}

int main() {
    int num1 = 10;
    int num2 = 20;
    int sum = add(num1, num2);

    printf("Sum: %d\n", sum);

    return 0;
}

2.2 静态函数与非静态函数的区别

静态函数和非静态函数的区别?用言语和示例代码进行解释

 •静态函数和非静态函数在C语言中的区别主要体现在函数的作用域和可见性上。

  1. 静态函数的作用域限制在定义它的源文件内部,只能在同一个源文件内的其他函数中调用,不可以被其他源文件调用。非静态函数的作用域为整个程序,可以在该程序的任何地方调用。
  2. 静态函数的可见性仅限于定义它的源文件,其他源文件无法直接访问和调用该函数。非静态函数具有全局可见性,其他源文件可以通过函数声明来访问和调用该函数。

•静态函数和非静态函数,在同一个源文件内的其他函数中调用(正常运行)

#include<stdio.h>
static int staticFunc(int a, int b) {//静态函数
    return a + b;
}
int nonStaticFunc(int a, int b) {//非静态函数
    return a - b;
}

int main() {
    int x = 10;
    int y = 5;
    
    int result1 = staticFunc(x, y);
    int result2 = nonStaticFunc(x, y);
    
    printf("Static Function Result: %d\n", result1);//Static Function Result: 15
    printf("Non-Static Function Result: %d\n", result2);//Non-Static Function Result: 5
    
    return 0;
}

•静态函数,被其他源文件调用(报错)

//static.c
#include<stdio.h>

static int staticFunc(int a, int b) {
    return a + b;
}
//main.c
#include<stdio.h>

static int staticFunc(int a, int b);

int main() {
    int x = 10;
    int y = 5;

    int result1 = staticFunc(x, y);
    printf("Static Function Result: %d\n", result1);

    return 0;
}

•非静态函数,被其他源文件调用(正常运行)

//non_static.c
#include<stdio.h>

int nonStaticFunc(int a, int b) {
    return a - b;
}
#include<stdio.h>

int nonStaticFunc(int a, int b);

int main() {
    int x = 10;
    int y = 5;

    int result2 = nonStaticFunc(x, y);
    printf("Non-Static Function Result: %d\n", result2);

    return 0;
}

三、静态全局变量

3.1 静态全局变量的定义

在函数外部使用static关键字声明的变量为静态全局变量,它们只能在当前文件中使用,其他文件无法访问。

#include <stdio.h>

// 声明静态全局变量
static int count = 0;

void func1() {
    count++;
    printf("func1: count = %d\n", count);
}
void func2() {
    count++;
    printf("func2: count = %d\n", count);
}

int main() {
    // 调用函数1和函数2,观察静态全局变量的变化
    func1();//func1: count = 1
    func2();//func2: count = 2
    func1();//func1: count = 3
    
    return 0;
}

3.2 静态全局变量和非静态全局变量的区别

1.初始化

静态全局变量在程序的生命周期内只被初始化一次。如果没有显示初始化,静态全局变量默认初始化为0。

非静态全局变量在程序的生命周期内可以被多次初始化。如果没有显示初始化,非静态全局变量默认初始化为0。

2.作用域范围

静态全局变量的作用域仅限于声明的文件内,不同文件内的同名静态全局变量是互相独立的。

非静态全局变量的作用域是整个程序,可以在程序的任何地方访问。

3.文件间的访问性

静态全局变量只能在声明的文件内访问

非静态全局变量可以在其他文件中使用extern关键字进行声明并访问。(extern int i;)


四、静态结构体变量 

4.1 静态结构体变量

静态结构体变量是指在程序运行时在静态存储区分配的结构体变量。静态存储区是程序运行时分配给全局变量和静态变量的存储区域,其生命周期从程序开始执行到结束。静态结构体变量的定义方式与普通结构体变量相同,但需要使用static关键字来声明。

static struct Person p1;

4.2 静态结构体变量与非静态结构体变量

1.初始化

静态结构体变量在没有显式初始化的情况下,默认会被设置为0。

非静态结构体变量在没有显式初始化的情况下,其成员变量的值默认情况下是未定义的,即不会自动被赋值为0。

2.作用域(这里可以类比静态本地变量与非静态本地变量)

静态结构体变量s1在每次函数调用之间保持其值。

非静态结构体变量s2在每次函数调用时都是新创建的,其值不会保持一致。

#include <stdio.h>

struct MyStruct {
    int value;
};

void myFunction() {
    static struct MyStruct s1;// 静态结构体变量
    s1.value++;

    struct MyStruct s2 = { 0 };// 非静态结构体变量
    s2.value++;

    printf("s1.value = %d,", s1.value);
    printf("s2.value = %d\n", s2.value);
}

int main() {
    myFunction();
    myFunction();
    myFunction();

    return 0;
}

4.3 题外话

 在进行AI查询过程中,由于“静态结构体成员变量”这个词走了点歪路,虽已更正,但仍做一小记:

1.C语言中,是不存在“静态结构体成员变量”的说法的。

2.区分结构体成员变量与结构体变量

#include <stdio.h>

// 定义结构体
struct Person {
    char name[20];
    int age;
};

int main() {
    // 声明一个结构体变量
    struct Person person;

    // 访问结构体的成员变量并赋值
    strcpy(person.name, "John");
    person.age = 25;

    // 打印结构体的成员变量
    printf("Name: %s\n", person.name);
    printf("Age: %d\n", person.age);

    return 0;
}

这个例子中,struct Person定义了一个名为Person的结构体,其中有两个成员变量nameage。在main函数中,我们声明了一个名为person的结构体变量,并使用.运算符来访问结构体的成员变量,并对其进行赋值。最后,我们使用printf函数打印出结构体的成员变量的值。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

挑战杯 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

两次NAT

两次NAT即Twice NAT&#xff0c;指源IP和目的IP同时转换&#xff0c;该技术应用于内部网络主机地址与外部网络上主机地址重叠的情况。 如图所示&#xff0c;两次NAT转换的过程如下: 内网Host A要访问地址重叠的外部网络Host B&#xff0c;Host A向位于外部网络的DNS服务器发送…

图文并茂讲解Travelling Salesman

题目 思路 一道lca板子题&#xff0c;不会的同学可以先康康 详解最近公共祖先(LCA)-CSDN博客 我们可以发现&#xff0c;商人是从1开始&#xff0c;旅行到第一个城镇&#xff0c;再到第二个&#xff0c;第三个…… 那么我们只需要求出1~第一个城镇的距离&#xff0c;第一个城…

爱上算法:每日算法(24-2月4号)

&#x1f31f;坚持每日刷算法&#xff0c;&#x1f603;将其变为习惯&#x1f91b;让我们一起坚持吧&#x1f4aa; 文章目录 [232. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/)思路CodeJavaC 复杂度 [225. 用队列实现栈](https://leetcode.cn/…

引入echarts环形图及显示后端数据

实现效果&#xff1a; 1.下载echarts 并引用 npm install echarts --save 或 pnpm install -S echarts 项目中引用&#xff1a; 在项目main.ts中 import * as echarts from "echarts"; //引入echarts 3.页面中使用 <div id"main" class&quo…

Maven配置笔记

1、下载Maven 在Maven的官网即可下载&#xff0c;点击访问Apache Maven。 2、配置环境变量 chcp 65001 echo off set mvnhomeE:\apache-maven-3.8.4 rem LPY echo. echo ************************************************************ echo * …

有水印的照片怎么删除水印?这几个照片去水印的方法教给你

如今社会发展迅猛&#xff0c;越来越多人用手机、相机等设备拍照和录视频&#xff0c;记录生活点滴。然而&#xff0c;这些照片和视频很多时候会因为水印而影响欣赏体验。水印不仅破坏了画面的美观&#xff0c;还可能遮挡了重要的内容。那么&#xff0c;有水印的照片怎么删除水…

私有化部署跳一跳

目录 效果 安装 1.安装httpd 2.下载跳一跳 3.启动httpd 使用 效果 安装 1.安装httpd yum -y install httpd systemctl enable httpd 2.下载跳一跳 cd /var/www/html/ git clone https://gitee.com/WangZhe168_admin/jump.git 3.启动httpd systemctl start httpd 使…

Centos7配置登录失败处理导致root被锁定处理办法

1、应用场景 root用户被系统锁定&#xff0c;无法登录系统。 2、问题现象 root锁定无法登录系统 3、原因 设置登录失败处理并对root用户生效&#xff0c;一直尝试错误的root密码或暴力破解root密码&#xff0c;导致无法自动解锁Linux的root账户 4、解决方案 1.将虚拟机开…

程序员为什么不喜欢关电脑,这回答很霸道!

在大家的生活中&#xff0c;经常会发现这样一个现象&#xff1a;程序员经常不关电脑。 至于程序员不关电脑的原因&#xff0c;众说纷纭。 其中这样的一个程序员&#xff0c;他的回答很霸道&#xff1a; “因为我是程序员&#xff0c;我有权选择不关电脑。我需要在任何时候都能够…

物联网ARM开发-STM32之RTC浅谈

RTC 一.RTC简单介绍 RTC好比我们用来记录时间的一个钟表&#xff0c;他里面有年月日&#xff0c;还可以记录星期&#xff0c;小时&#xff0c;分钟等。是Real Time Clock的缩写&#xff0c;译为实时时钟&#xff0c;本质上是一个独立的定时器。 1. 1 与通用定时器的区别 可以…

操作系统笔记之内存映射

操作系统笔记之内存映射 —— 杭州 2024-02-04 code review! 文章目录 操作系统笔记之内存映射一.内存映射概念1. 文件映射到内存 (Memory-Mapped Files)2. 虚拟内存管理 (Virtual Memory Management)3. 内存映射I/O (Memory-Mapped I/O)4. 图形处理 (Graphics Processing)5.…

【AI】手把手教你用SSH与GitHub仓库建立连接

在使用原来的账户密码方式建立连接时&#xff0c;发现终端提示&#xff1a; remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#…

Spring框架——主流框架

文章目录 Spring(轻量级容器框架)Spring 学习的核心内容-一图胜千言IOC 控制反转 的开发模式Spring快速入门Spring容器剖析手动开发- 简单的 Spring 基于 XML 配置的程序课堂练习 Spring 管理 Bean-IOCSpring 配置/管理 bean 介绍Bean 管理包括两方面: Bean 配置方式基于 xml 文…

【深度学习理论】持续更新

文章目录 1.统计学习理论 1.统计学习理论 统计学习理论&#xff0c;一款适合零成本搞深度学习的大冤种的方向 从人类学习到机器学习的对比&#xff08;学习的过程分为归纳和演绎 &#xff09;&#xff0c;引出泛化和过拟合的概念。 如何表示归纳的函数规律呢&#xff1f;以监督…

基础数学问题整理

最近刷了一些关于基础数学问题的题目&#xff0c;大致是关于组合数、分解质因数还有一些思维题&#xff0c;题目来自洛谷的【数学1】基础数学问题 - 题单 - 洛谷&#xff0c;很多思路还是之前没有见过的&#xff0c;都是简单到一般难度的题目&#xff08;橙、题、绿题&#xff…

远程桌面时连接不上远程计算机是什么问题

在服务器上搭建网络程序时&#xff0c;我们经常会有需要远程连接上服务器进行相关操作&#xff0c;有些用户在远程桌面的时候&#xff0c;有时会有遇上无法连接到远程计算机的情况。 很多用户都曾遇到在远程桌面时出现“未启用对服务器的远程访问”、“远程计算机已关闭”、“…

AIGC技术讲解以及应用的落地

简介 近期&#xff0c;火爆的“AI绘画”、图片转AI图&#xff0c;智能聊天软件ChatGPT&#xff0c;引起了人们广泛关注。人工智能潜力再次被证明&#xff0c;而这三个概念均来自同一个领域&#xff1a;AIGC。AIGC到底是什么&#xff1f;为什么如此引人关注&#xff1f;AIGC能产…

代码生成器(新):mybatis-plus-generator使用指南

代码生成器&#xff08;新&#xff09;官网 后端代码&#xff1a;点击查看 LearnElementUiAndSpringBoot 提醒&#xff1a;LearnElementUiAndSpringBoot下载完后&#xff0c;在运行调试 Main.java里的main方法之前&#xff0c;除了utils包和Main.java文件&#xff0c;其他包需…

rac二节点实例redo故障无法启动修复

问题描述 节点二由于redo故障问题无法正常启动 目前节点二为mount状态&#xff0c;open报错。alter database open ERROR at line 1: ORA-00322: log 28 of thread 2 is not current copy ORA-00312 查询v$log视图发现节点二的redo log组没有状态为current的日志组。大概…