C语言 存储类型 关键字

目录

一、C 程序中可用的存储类

二、C 语言部分关键字

1. sizeof关键字

2. sizeof 对变量名或者字面值可以不用括号,但是计算类型是必须要加括号的

3. sizeof 与 strlen 的区别

4. volatile关键字


一、C 程序中可用的存储类

概述:存储类定义 C 程序中变量/函数的存储位置、生命周期和作用域

  • 1. auto 存储类是局部变量默认存储类, 限定变量只能在函数内部使用。

    定义在函数中的变量默认为 auto 存储类,它们在函数开始时被创建,在函数结束时被销毁。

     int mount;auto int month;
  • 2. register 存储类用于定义寄存器变量:这些变量不存储在内存中,而是存储在寄存器中。寄存器变量与存储在 RAM 中的局部变量不同。寄存器变量的最大尺寸等于寄存器的大小(通常为一个字)。此外,不能对寄存器变量应用一元的 '&' 运算符,因为它们没有内存地址。

    由于寄存器变量存储在寄存器中,因此访问速度更快。然而,由于它们不是存储在 RAM 中,因此不能直接获取其地址。在需要频繁访问的变量上使用 register 存储类可以提高程序的运行速度。

     {register int  miles;}
  • 3. static 存储类编译器在程序的生命周期内保持局部变量的存在而不需要在每次它进入和离开作用域时进行创建和销毁因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值不变。

    static 修饰符也可以应用于全局变量。static 修饰全局变量时,会使变量的作用域限制在声明它的文件内它可以被该文件中的所有函数访问,包括 main() 函数。其它文件中使用extern 引用的方式是无法访问到这个变量的
    把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
    函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

#include <stdio.h>  int* create_array() 
{  // 必须使用static 否者会在函数结束后被销毁static int arr[5] = {1, 2, 3, 4, 5};  return arr;  
}  int main() 
{  int* ptr = create_array();  for (int i = 0; i < 5; ++i) {  printf("%d ", ptr[i]);  }  return 0;  
}

静态变量在程序中只被初始化一次,即使函数被调用多次,该变量的值也不会重置。

  • 4. extern 存储类用于:声明定义在其他文件中的全局变量或函数当使用 extern 关键字时,不会为变量分配任何存储空间,把变量名指向一个之前定义过的存储位置。extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,


二、C 语言部分关键字

概述:

1. sizeof关键字

作用:sizeof 在 编译阶段处理,作用为取得一个对象(数据类型或数据对象)的长度(即占用内存的大小,以1字节为单位)。

语法如:sizeof(对象);对象可以是变量 类型。

# include <stdio.h>
# include <string.h>int main()
{int a;printf("sizeof(char): %d\n", sizeof(char));printf("sizeof(short): %d\n", sizeof(short));printf("sizeof(int): %d\n", sizeof(int));printf("sizeof(long): %d\n", sizeof(long));printf("sizeof(long long): %d\n", sizeof(long long));printf("sizeof(float): %d\n", sizeof(float));printf("sizeof(double): %d\n", sizeof(double));printf("sizeof(a): %d\n", sizeof(a));return 0;
}

结果

sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 4
sizeof(long long): 8
sizeof(float): 4
sizeof(double): 8
sizeof(a): 4

2. sizeof 对变量名或者字面值可以不用括号,但是计算类型是必须要加括号的

# include <stdio.h>
# include <string.h>int main()
{char c = 'a';printf("sizeof c: %d\n", sizeof c);printf("sizeof 1: %d\n", sizeof 1);return 0;
}

结果

sizeof c: 1
sizeof 1: 4

注意:但是如果直接使用sizeof int 则是不可以

3. sizeof 与 strlen 的区别

sizeof 是一个运算符,而不是函数。它用于获取指定类型或对象的字节大小。在编译时计算,返回的是字节数。通常用于获取数组、结构体、变量等的大小。

strlen 是一个函数,用于计算字符串的长度,即字符串中非空字符的数量,不包括字符串结束符 '\0'。在运行时遍历字符串直到遇到结束符,并返回字符数
sizeof 返回的是字节数,而 strlen 返回的是字符数,因此在计算字符串占用的内存时要考虑字符串结束符 \0。

sizeof  可以用数据类型作为参数,如int char;
strlen  只能使用 char*作参数且以\0为结尾
sizeof 为数组时候,不退化, 传递给strlen时数组会被退化成指针;

  • 当你传递一个数组给strlen时,实际上你传递的是一个指向数组第一个元素的指针。因此,在这种情况下,sizeof  strlen的行为是不同的:sizeof会返回整个数组的大小,而strlen会返回字符串的长度(不包括终止的\0)。

例如:

# include <stdio.h>
# include <string.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,0 };printf("sizeof(arr): %d\n", sizeof(arr));char arr2[] = "hello";printf("sizeof(arr2): %d\n", sizeof(arr2));printf("strlen(arr2): %d\n", strlen(arr2));return 0;
}

结果:

sizeof(arr): 40
sizeof(arr2): 6
strlen(arr2): 5

使用sizeof计算数组时,结果为数组长度*数组元素占用空间的大小,当数组为字符数组时,sizeof的功能是一致的,只不过当使用字符数组定义字符串的时候,对于字符串比如hello,数组中会自动增加一个元素’\0’,所以sizeof计算的结果为6,而strlen是计算字符串长度的,遇到’\0’结束,但是不把’\0’计算在内,因此strlen计算的结果为5,这与我们感觉上的字符串的长度为5的感觉是一致的,这就是strlen和sizeof在计算字符数组的时候的区别

4. volatile关键字

我们可以实时获取它这个变量的最新值

volatile它就是一个“易变”的一个变量,我们每次获取它值的时候,都是从它内存里去读取。

更深层次含义: 用volatile这样来告诉编译器,叫它不要对我这个变量做过分优化,也就是告诉它我这个变量用在哪,就实打实的访问它的内存,而不是访问这个变量所构建的一个寄存器。

我们用这样的变量的时候,它可能同时被好几个中断或者好几个线程同时调用,我们volatile这样的变量可以保证获取这个变量值的实时性

即:volatile关键字是告诉编译器不要优化修饰的变量,直接访问它。

volatile int flag;

上一篇:C语言数据类型

下一篇: 

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

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

相关文章

面试经典150题(90-92)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第四十八天&#xff09;完成了3道(90-92)150&#xff1a; 90.&#xff08;108. 将有序数组转换为二叉搜索树&#xff09;题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排…

深入Amazon S3:实战指南

Amazon S3(Simple Storage Service)是AWS(Amazon Web Services)提供的一项强大的云存储服务,广泛用于存储和检索各种类型的数据。本篇实战指南将深入介绍如何在实际项目中充分利用Amazon S3的功能,包括存储桶的创建、对象的管理、权限控制、版本控制、日志记录等方面的实…

ubuntu安装kibana

1、安装elastic search7 参考&#xff1a;elastic search入门-CSDN博客 2、安装kibana&#xff0c;版本对不上&#xff0c;不匹配&#xff0c;不能正常启动。 kibana要改成7.11.1版本的试试。 nohup wget https://artifacts.elastic.co/downloads/kibana/kibana-7.11.1-linu…

从0开始学习C++ 第一课:你的第一个C++程序

第一课&#xff1a;你的第一个C程序 当然可以。让我们从C的基础开始&#xff0c;我们的第一课将覆盖以下几个主题&#xff1a; 程序结构编写和运行你的第一个C程序基本的输入输出&#xff08;I/O&#xff09; 第一课&#xff1a;你的第一个C程序 在C中&#xff0c;所有的程…

Spring-配置文件

一、引子 了解完Spring的基本概念后&#xff0c;我们紧接着来了解Spring中的核心文件--Spring配置文件。 二、配置Bean 我们在上一节Spring的基本概念中快速使用了一下Spring&#xff0c;其中我们在配置文件中主要涉及到就是Bean标签的配置&#xff1a;主要的配置字段有id, …

Servlet系列:生命周期(init、 service、destroy)详解

Servlet的生命周期是由Web容器&#xff08;如Tomcat&#xff09;管理的&#xff0c;包括以下三个阶段&#xff1a; 加载和实例化&#xff1a;当Web应用程序启动时&#xff0c;Web容器会加载和实例化Servlet。加载和实例化过程可以在应用程序启动时自动完成&#xff0c;也可以通…

Mac上如何设置映射某个网站站点域名的IP

最近某常用的站点换 IP 了&#xff0c;但是 DNS 服务器还没有修改&#xff0c;这就导致无法访问&#xff08;换 DNS 服务器也不行&#xff09;。在用了一段时间的 IP 访问之后&#xff0c;还是没好&#xff0c;不知道是 DNS 污染还是咋了&#xff0c;所以最后还是手动改一下吧。…

MySQL定期整理磁盘碎片

MySQL定期整理磁盘碎片&#xff1a;提升数据库性能的终极指南 MySQL作为一个强大的关系型数据库管理系统&#xff0c;在长时间运行后可能会产生磁盘碎片&#xff0c;影响数据库性能。本博客将深入讨论如何定期整理MySQL磁盘碎片&#xff0c;以确保数据库的高效运行。我们将介绍…

mac滚动截图

参考博客 https://www.zhihu.com/question/313673726/answer/2938671835 首先去AppStore搜索 iShot 这个也是要钱的&#xff0c;不过我输入appleID后&#xff0c;并没有扣我钱&#xff0c;不知道设么回事 然后打开iShot 点击观看视频&#xff0c;然后mac会自动打开一个新的…

Softing mobiLink Power:集成FDI技术,简化多协议总线设备的配置方式

Softing的mobiLink Power是一款多协议总线通信工具&#xff0c;用于调试和维护过程自动化现场设备。目前&#xff0c;该工具已具备完整的FDI CommServer&#xff08;包括FF、PA、HART&#xff09;&#xff0c;并支持与FDI客户端一起使用&#xff0c;如艾默生的AMS Device Confi…

LeetCode 670 最大交换数

周一&#xff0c;非常冷&#xff0c;大风呼呼的&#xff0c;上班路都走不动。 好消息&#xff0c;马上要过年了。大风吹&#xff0c;天气好。 过年过年&#xff0c;回家过年~ 学生时代的迷茫是不应该存在的&#xff0c;最好的时光应该尽情享受&#xff0c;而不应该自己给加层…

西门子触摸屏维修6AV7880-0AA22-2DA2

西门子SIMATIC ITP1000平板PC机10.1 英寸采用 Intel Core i5 Skylake CPU&#xff0c;适合需要达16GB RAM的较高图形性能的工业移动计算应用。该 CPU 还提供了足够性能储备以满足将来的要求。安装的 Microsoft Windows 7 和 Microsoft Windows 10 操作系统以合理方式集成到现有…

68. redis计数与限流中incr+expire的坑以及解决办法(Lua+TTL)

文章目录 一、简介二、代码演进第一版代码&#xff08;存在bug隐患&#xff09;第二版代码&#xff08;几乎无隐患&#xff09;第三版代码(完美无瑕&#xff09; 一、简介 在日常工作中&#xff0c;经常会遇到对某种操作进行频次控制或者统计次数的需求&#xff0c;此时常用的…

RepLKNet 学习笔记

目录 原版测试代码: torch版本: RepLKNet 哔哩哔哩 原版测试代码: 1060显卡,224*224,平均时间10ms以内。 import timeimport torchfrom unireplknet import unireplknet_aif __name__ == __main__:net = unireplknet_a()net.cuda()net.eval()for i in range(20):

1411111111

第一张 用户管理表&#xff08;客户&#xff09; sys_user user_id 用户ID username 用户名 password 密码 phonenumber 电话 open_id 微信openID session_key 微信key user_type 管理员 维修员 客户 dept_id 部门ID 第五 维修人员表&#xff08;维修员&#xff09;sys_mainta…

深入了解Linux中常见的五种文件类型

了解文件类型对于正确理解和管理文件系统非常重要。希望本文能够帮助您更好地了解Linux中常见的文件类型及其在ls -l命令输出中的表示方式。​ 在Linux操作系统中&#xff0c;文件是操作系统中最基本的概念之一。在Linux中&#xff0c;每个文件都有一个特定的类型&#xff0c;这…

Elasticsearch分布式一致性原理剖析(一)-节点篇

前言 “Elasticsearch分布式一致性原理剖析”系列将会对Elasticsearch的分布式一致性原理进行详细的剖析&#xff0c;介绍其实现方式、原理以及其存在的问题等(基于6.2版本)。 ES目前是最流行的分布式搜索引擎系统&#xff0c;其使用Lucene作为单机存储引擎并提供强大的搜索查…

从0开始学习C++ 第二十课:模板与泛型编程

第二十课&#xff1a;模板与泛型编程 学习目标&#xff1a; 掌握模板的基本语法和概念。学会使用函数模板来创建可重用的函数。学习如何定义类模板以实现数据结构的泛型。理解模板在C中提供的灵活性和强大功能。 学习内容&#xff1a; 模板的概念&#xff1a; 模板是C中支持…

解决Git添加.gitignore文件后不生效的问题

1. 问题描述 如上图所示&#xff0c;在已存在.gitignore文件且已经提交过的Git管理的项目中&#xff0c;其中.class、.jar文件以及.idea目录内的内容全部都还是被Git管理了&#xff0c;可见.gitignore文件并没有生效。 2. 原因发现 .gitignore文件只能作用于 Untracked Files…

eNSP学习——配置通过FTP进行文件操作

原理概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;在TCP/IP协议族中属于应用层协议&#xff0c;是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…