C语言——存储类型

news2024/7/6 17:43:17

目录

  • 1. auto 自动型
  • 2. static 静态
    • 2.1 修饰变量
      • 要知道👇(数据在Linux内核中的分配图)
    • 2.2 static 的特点⭐⭐⭐⭐⭐:
    • 2.2 修饰函数
  • 3. extern
  • 4. register 寄存器类型

存储类型
存储类型有:auto static extern register

1. auto 自动型

修饰变量,一般省略存储类型会默认为auto。

特点:

  • 修饰的变量存放在栈区
  • 修饰的变量特点:初值随机(如果变量不赋初值)
  • 栈区:由系统自动开辟与释放

2. static 静态

可以修饰变量或函数

2.1 修饰变量

  1. 变量的存放位置在全局区(静态区),如果静态变量有初值(非零),存放.data区;没有初值存放在.bss区域。
  2. 生命周期为整个程序
  3. 限制作用域:
  • 修饰局部变量,和普通局部变量作用域没有区别,但是生命周期被延长为整个程序。也就是在作用函数外有生命但是不能被操作,变成了植物人。
  • 修饰全局变量,限制在本文件中使用。
  1. 值初始化一次,初值赋值为0。

要知道👇(数据在Linux内核中的分配图)

👉初始化为0的全局变量和静态变量存放在.bss区域

👉问:为什么未初始化的全局变量和静态变量初值为 0 ?

  • 答:因为这两种变量都存放在 .bss区域中

p9Tg6f0.png

2.2 static 的特点⭐⭐⭐⭐⭐:

  • static的本质是延长变量或函数的生命周期,同时限制其作用域。
  • static声明的全局变量、函数,仅当前文件内可用,其他文件不能引用。
  • static在函数内部声明的内部静态变量,只需初始化一次。
  • 而且变量存储在全局数据段(静态存储区)中,而不是栈中,其生命周期持续到程序退出。

举例对比用static和不用的局部变量在函数中自加操作

#include <stdio.h>
void fun()
{
    static int a;       //初值为0
    int b=0;
    a++;
    b++;
    printf("in fun:%4d %4d\n",a,b);
}
int main(int argc, char const *argv[])
{
    fun();  
    fun(); 
    fun();
    return 0;
}

打印结果:

in fun:   1    1
in fun:   2    1
in fun:   3    1

因为a用static修饰,所以会保留上一次调用函数后留下的值。此时a放在静态区。

static在函数内部声明的内部静态变量,只需初始化一次👇

#include <stdio.h>
int fun(void)
{ 
	//初始化:定义变量的同时给变量赋值;
   	 static int count = 10; //.data //static修饰的变量只初始化一次,下面使用的值,是上面运算后的结果	
   	 return count--;
 } 
int count = 1;
int main(void)
{         
     for(; count <= 10; ++count) 
         printf("%d,%d\n", count, fun());  //打印结果为:1,10;2,9 ......  10,1;							
     return 0;
}

2.2 修饰函数

static修饰函数,限制在本文件中使用。

总的来说,使用 static 定义的变量存储在静态存储区中,具有静态持续性,即使函数返回,它的值也会保留。而且,static 变量只能在当前文件中访问,不能被其他文件访问。

3. extern

外部引用:

通过extern可以引用其他文件中的全局变量或函数

举例对比引用外部变量和函数,如果加static和不加的区别 ↓

p9T2BjO.png

解释:因为变量b和函数fun2()被static修饰,所以限制在fun.c内不能被其他文件调用。

4. register 寄存器类型

register是寄存器类型,顾名思义,是把修饰的变量放到寄存器中,目的是为了提高程序的运行效率。但要记住,不管是单片机也好,计算机也罢,任何CPU的寄存器资源都是有限的,如果寄存器满了,被修饰的变量就会默认回到auto类型。

寄存器相当于皇帝身边的小太监,离皇帝近。而内存就相当于大臣,离皇帝比较远,但是地位高。

高程序的运行效率。但要记住,不管是单片机也好,计算机也罢,任何CPU的寄存器资源都是有限的,如果寄存器满了,被修饰的变量就会默认回到auto类型。

寄存器相当于皇帝身边的小太监,离皇帝近。而内存就相当于大臣,离皇帝比较远,但是地位高。

p9T2yHH.png
请添加图片描述

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

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

相关文章

2023最全selenium面试题及答案,测试员没有碰到算我输.....

一、前言 Selenium&#xff0c;是一个开源的框架&#xff0c;主要用于做HTML页面的UI自动化测试。不过&#xff0c;selenium IDE在去年官方已宣告放弃维护了。官网上放着一句话&#xff0c;selenium IDE is Dead。Selenium IDE是火狐浏览器的一个插件&#xff0c;是Selenium的…

上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今年的校招基本已经进入大规模的开奖季了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好…

低功耗IC后端培训 | 盘点Power Switch Cell在实际项目中应用注意事项

下面直接进入今天的技术干货分享——全面盘点power gating cell在数字IC后端实现中的各种注意事项。 什么是Power Gating? 随着工艺制程越做越小和芯片规模越来越大&#xff0c;芯片的leakage的比重越来越高&#xff0c;数字后端实现时就得考虑leakage的优化。而leakage优化…

交通标志识别系统-卷积神经网络

介绍 使用Python作为主要开发语言&#xff0c;基于深度学习TensorFlow框架&#xff0c;搭建卷积神经网络算法。并通过对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型。并基于Django框架&#xff0c;开发网页端操作平台&#xff0c;实现用户上传一张图片识别其名…

Linux 软件包管理工具

rpm命令管理软件包 1.学会看rpm包&#xff0c;通过rpm包的名字来了解这个软件包的一些基础信息xfsprogs-4.19.0-2.el8.x86_64.rpm xfsprogs 软件名字 4.19.0 版本号 2 发行次数 el8 适用于哪个操作系统&#xff08;rel8&#xff09; x86_64 软…

Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践(解决升级问题)

在Streamlit官方文档中&#xff0c;没有提供提供安全身份验证组件。目前&#xff0c;第三方streamlit-authenticator提供此功能&#xff0c;详见引用我原来的博文&#xff0c;在《Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践》文中&#xff0c;原…

Vue计算属性

1&#xff0c;为什么Vue会设计计算属性(computed property)&#xff1f; 答&#xff1a;一定程度上&#xff0c;Vue的作用就是管理呈现到HTML页面上的所有数据data的&#xff0c;每当一个data发生变化&#xff0c;Vue实例就会自动的去更新模板里面使用到data的地方&#xff0c;…

pytorch完整模型训练套路

文章目录 CIFAR10数据集简介训练模型套路1、准备数据集2、加载数据集3、搭建神经网络4、创建网络模型、定义损失函数、优化器5、训练网络6、测试数据集7、添加tensorboard8、转化为正确率9、保存模型 完整代码 本文以 CIFAR10数据集为例&#xff0c;介绍一个完整的模型训练套路…

机器学习-线性代数-向量、基底及向量空间

概述 文章目录 概述向量理解向量运算 基底与向量的坐标表示基底与向量的深入基底与向量选取与表示基底的特殊性张成空间 向量 理解 直观理解 行向量&#xff1a;把数字排成一行A [ 4 5 ] [4~ 5] [4 5]列向量&#xff1a;把数字排成一列A [ 4 5 ] \ \left [ \begin{matrix}…

多线性开发实例分享

一. 概述 首先&#xff0c;在这里有必要和大家复现一下我使用该技术的背景&#xff1a; 在使用若依框架的时候&#xff0c;由于实际开发的需要&#xff0c;我需要配置四个数据源&#xff0c;并且通过mapper轮流去查每个库的指定用户数据&#xff0c;从而去判断改库是否存在目标…

构建一个简易数据库-用C语言从头写一个sqlite的克隆 0.前言

英文源地址 一个数据库是如何工作的? 数据是以什么格式存储的(在内存以及在磁盘)?何时从内存中转移到此磁盘上?为什么每张表只能有一个主键?回滚一个事务是如何工作的?索引是以什么格式组织的?什么时候会发生全表扫描, 以及它是如何进行的?准备好的语句是以什么格式保…

#C2#S2.2~S2.3# 加入 factory/objection/virtual interface 机制

2.2 加入factory 机制 factory机制的实现被集成在了一个宏中&#xff1a;uvm_component_utils。这个宏所做的事情非常多&#xff0c;其中之一就是将my_driver登记在 UVM内部的一张表中&#xff0c;这张表是factory功能实现的基础。只要在定义一个新的类时使用这个宏&#xff0…

斐波那契数列相关简化4

看这篇文章前需要看下前面三篇文章&#xff0c;最起码第一第二篇是需要看一下的 斐波那契数列数列相关简化1_鱼跃鹰飞的博客-CSDN博客 斐波那契数列数列相关简化2_鱼跃鹰飞的博客-CSDN博客 算法玩的就是套路&#xff0c;练练就熟悉了 再来一个&#xff1a; 用1*2的瓷砖&am…

如何在 CentOS Linux 上安装和配置 DRBD?实现高可用性和数据冗余

DRBD&#xff08;Distributed Replicated Block Device&#xff09;是一种用于实现高可用性和数据冗余的开源技术。它允许在不同的服务器之间实时同步数据&#xff0c;以提供数据的冗余和容错能力。本文将详细介绍如何在 CentOS Linux 上安装和配置 DRBD。 1. 确认系统要求 在…

一文带你了解MySQL之InnoDB统计数据是如何收集的

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 我们前边唠叨查询成本的时候经常用到一些统计数据&#xff0c;比如通过show table status可以看到关于表的统计数据&#xff0c;通过show index可以看到关于索引的统计数据&#xff0c;那…

MySQL之事务初步

0. 数据源 /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80016Source Host : localhost:3306Source Schema : tempdbTarget Server Type : MySQLTarget Server Version…

在线OJ常用输入规则

一、字符串输入规则 1.1 单行无空格字符串输入 输入连续字符串&#xff0c;cin默认空格/换行符为分割标志。 string s; //输入连续字符串&#xff0c;cin默认空格/换行符为分割标志。 cin >> s; 1.2 单行有空格字符串输入 getline函数接受带有空格的输入流&#xff…

C++——初识模板

文章目录 总述为什么要有模板函数模板概念函数模板使用方法函数模板的原理函数模板的实例化隐式示例化显式实例化 模板参数的匹配规则 类模板类模板的实例化 总述 本篇文章将带大家简单的了解一下c的模板方面的知识&#xff0c;带大家认识什么是模板&#xff0c;模板的作用&…

STL-常用算法(一.遍历 查找 排序)

目录 常用遍历算法&#xff1a; for_each和transform函数示例&#xff1a; 常用查找算法&#xff1a; find函数示例&#xff1a; find_if函数示例&#xff1a; adjacent_find示例&#xff1a; binary_search函数示例&#xff1a; count函数示例&#xff1a; count_if函…

训练/测试、过拟合问题

在机器学习中&#xff0c;我们创建模型来预测某些事件的结果&#xff0c;比如之前使用重量和发动机排量&#xff0c;预测了汽车的二氧化碳排放量 要衡量模型是否足够好&#xff0c;我们可以使用一种称为训练/测试的方法 训练/测试是一种测量模型准确性的方法 之所以称为训练…