C语言里面那些你必须知道的常用关键字(详细讲解)

news2024/10/7 0:27:52

前言

  哈喽,各位铁汁们好啊!✨今天来给大家带来的是C语言中我们常用的关键字静态static的详细讲解和typedef#define定义常量和宏。
  既然是详解想必大家必定是想学一些平常学不到的东西吧!这里博主给大家详细讲解static修饰的变量在内存重视如何存储的,顺带给大家讲一下C/C++中的内存大致分为几个区域是如何存储的!废话不说了上干货

在这里插入图片描述

章节目录

  • 前言
  • 序言
    • 1. C/C++中内存大致分的三个区域
    • 2. 关键字static
      • 静态局部变量
          • 静态局部变量的作用域和生命周期
      • 静态全局变量
      • 静态函数
    • #define 定义常量和宏
      • #define 定义常量
      • #define 定义宏
            • 那么宏是怎么调用的呢?和函数有什么区别嘞?
    • 关键字 typedef
      • 总结

序言

1. C/C++中内存大致分的三个区域

  • 栈区(stack):由编译器自动分配释放。
        存放 :局部变量、形参、返回值。
  • 堆区 (heap): 由程序员分配内存和释放。
      调用函数 :malloc() free()等。
  • 静态区 :通常是用于那些在编译期间就能确定存储大小的变量的存储区,全局变量静态变量

在这里插入图片描述

2. 关键字static

在C语言中:

  • static是用来修饰变量和函数的

     1. 修饰局部变量-称为静态局部变量
     2. 修饰全局变量-称为静态全局变量
     3. 修饰函数-称为静态函数
    

静态局部变量

示例:

大家来来看这段代码

在这里插入图片描述

  • 局部变量 a a a,在没有static修饰之前局部变量a是存放在栈区的。所以每次出局部范围就销毁(把空间还给操作系统)。然后,调用时重新创建初始化。
  • 那我们把局部变量a加上static关键字修饰成静态局部变量,会怎么样呢?
//static 修饰局部变量的时候
//本来一个局部变量是存放在栈区的,如果被static修饰就存储到静态区了
//static 修饰局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束才结束
//但是作用域不变
void test()
{
	static int a = 5;//静态变量的
	a++;
	printf("%d ", a);
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}

	return 0;
}

在这里插入图片描述

这里static关键字把变量a修饰成了静态变量,所以变量 a a a 本来是存放在栈区的,但是由于被修饰成静态变量所以被存放在静态区了。

  • 静态区变量的特点:

    • 创建好后,直到程序结束才销毁
      在这里插入图片描述

这里说明了:
静态变量a在程序编译的时候就自动创建好了。并且已经完成初始化了
而没有修饰呢:
在这里插入图片描述
没有修饰之前必须进入函数体中初始化语句才会完成初始化。

静态局部变量的作用域和生命周期

前面我们说了静态变量是创建完成后,直到程序结束才销毁。
所以

  • 静态变量的生命周期是整个工程。

而静态局部变量的作用域呢?

  • 虽然我们把变量a修饰成了静态局部变量
  • 但是他本质上还是个局部变量

所以他的作用域不变还是它所在的局部范围

静态全局变量

我们都这样全局变量的作用域是

  • 整个工程
    在这里插入图片描述
    可以看到只要在一个工程内,不同.c文件之间只要
    (声明)也可以调用。

  • 说明;

  • 全局变量具有外链接属性。

但是我们用static关键字修饰成静态全局变量看看

在这里插入图片描述
说明
static 修饰全局变量

  • 改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性
  • 就是这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了
  • 感觉像是作用域变小了

静态函数

static修饰函数和修饰全局变量是一样
在这里插入图片描述

用static修饰函数了之后

在这里插入图片描述
说明:
用static修饰函数

  • static 修饰函数和static修饰全局变量是一样的
  • 函数是具有外部链接属性的,但是被static修饰,就变成了内部链接属性
  • 使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用的

#define 定义常量和宏

#define 定义常量

#define M 100

int main()
{
	int arr[M] = {0};//100*4 = 400
	int m = M;
	printf("%d\n", sizeof(arr));//400
	printf("%d\n", M);
	printf("%d\n", m);
	return 0;
}

这里#define 定义的是M这个标识符常量

  • 以后我们在碰到M的时候编译器在编译期间,就会自动替换为常量100
  • 通常在定义数组时使用或者重复值时。

#define 定义宏

我们来看一下宏是怎么定义的:
在这里插入图片描述
和定义函数非常相识
在这里插入图片描述
但是宏没有函数的返回类型参数类型
还是很不一样的,宏的实现体一般都是表达式

那么宏是怎么调用的呢?和函数有什么区别嘞?
//宏
#define ADD(x, y) ((x)+(y))

//函数
int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	//int c = (a)+(b);
	printf("%d\n", c);

	int d = Add(a, b);
	printf("%d\n", d);
	return 0;
}

我们可以看到宏的调用也和函数产不多
但是

  • int c = ADD(a, b);这段代码调用宏的本质是替换

  • int c = (a)+(b);在编译的时候就把ADD这个宏替换成这样

    而函数调用是

  • 把实参传到函数形参里面进行计算,然后在返回值

关键字 typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。
示例:

//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
    //观察num1和num2,这两个变量的类型是一样的
    unsigned int num1 = 0;
    uint_32 num2 = 0;
    return 0;
}

总结

好了今天主要是带大家认识关键字 static#define typedef
总结一下今天学了:
  关键字static
  关键字static修饰变量的作用域变化
  #define定义的宏和常量
  关键字typedef

不知道大家掌握了没有,希望对各位铁汁有用呢!
看到这里了还不给博主扣个点赞收藏
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
在这里插入图片描述

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

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

相关文章

2023最全的Java架构师面试120题解析(MySQL/Redis/架构/高并发等)

最全架构师题目将包含如下技术范围&#xff1a; 1.Java基础和高级: 集合框架: List&#xff1a;ArrayList、LinkedList&#xff1b;Set&#xff1a;HashSet、TreeSet Map:TreeMap/ConcurrentHashMap&#xff1b;Queue:ConcurrentLinkedQueue等 泛型、反射、并发编程、JVM、A…

基于Smb协议实现网络文件传输(Golang)

在前面章节已经展示了一些关于SMB的基本介绍&#xff0c;以及对应SMB相关操作的Java实现&#xff0c;这一章主要是前一章的补充&#xff0c;使用Golang来对 SMB共享文件夹进行操作。如果没有阅读过上一章节的同学&#xff0c;请跳转到 基于Smb协议实现网络文件传输&#xff0c;…

Axure教程—折叠面手风琴效果

上文中介绍了用Axure制作折叠面板的基础制作&#xff0c;这次介绍折叠面板手机风琴效果 效果 预览地址&#xff1a;https://e18rf6.axshare.com 功能 点击标题展开内容&#xff0c;点击另一标题&#xff0c;其展开的内容折叠 制作 拖入四个动态面板&#xff0c;分别命名为1、…

PHP流程控制与文件包含:基础与关键要点

目录 PHP流程控制 顺序结构&#xff1a; 分支结构&#xff1a; Switch分支&#xff1a; PHP循环结构 for循环 while循环 do-while循环 while和do-while的区别&#xff1a; 循环控制 流程控制代替语法 PHP文件包含 PHP文件包含的作用 PHP文件包含的四种形式 PHP文…

【spring cloud学习】3、Eureka Server注册中心

Eureka本身是Netflix开源的一款注册中心产品&#xff0c;并且Spring Cloud提供了相应的集成封装。选择Eureka作为注册中心实例来讲解是出于以下原因&#xff1a; &#xff08;1&#xff09;Eureka在业界的应用十分广泛&#xff0c;整个框架经受住了Netflix严酷生产环境的考验。…

Qt中的信号和信号槽(一)

目录 1. 信号和槽概述 信号和槽的关系 2. 标准信号槽使用 标准信号/槽 示例&#xff1a; 3. 自定义信号槽使用 自定义信号 自定义槽 示例&#xff1a; 1. 信号和槽概述 信号和槽是一种事件驱动的通信机制&#xff0c;广泛应用于Qt框架的事件处理、GUI编程、网络通信等…

如何在教育与科研领域使用ChatGPT

ChatGPT提示是您给予ChatGPT的一系列指示&#xff0c;以便它能够按需生成结果。由于ChatGPT是一种会话型人工智能&#xff0c;因此它需要明确的指示才能生成准确的结果。 ChatGPT提示的结构通常是以指令格式呈现的。它看起来像是您在与AI交流&#xff0c;给予它执行特定任务的…

基于树莓派4B的OpenCV安装与简单应用(真速通版)

前言&#xff1a;本文为手把手教学树莓派4B的OpenCV安装与简单应用&#xff08;真速通版本&#xff09;&#xff0c;树莓派4B最为目前最新款的树莓派家族一员深受创客和开发者喜爱。树莓派4B作为一款搭载 Cortex-A72 系列芯片的板载电脑&#xff0c;其不仅可以作为简单的 MCU 进…

第三方库介绍——Protobuf库(更高效的协议)

文章目录 protobuf综述传输协议与指令创建协议编译协议介绍addressbook.pb.h文件序列化与反序列化的接口 利用soctet实现客户端与服务端传输协议Linux&#xff08;Ubuntu&#xff09;安装protoc步骤编写案例代码Cartoon.prototcpsocket.hMyTcpsocket.hclient.cppserver.cppCMak…

01.4进程原理和系统调用--->经典的CFS调度器

进程的一些正常状态 什么是进程 操作系统作为硬件的使用层&#xff0c;提供使用硬件资源的能力&#xff0c;进程作为操作系统使用层&#xff0c; 提供使用操作系统抽象出的资源层的能力。 进程&#xff1a;是指计算机中已运行的程序。进程本身不是基本的运行单位&#xff0c;…

【微服务】springboot 通用限流方案设计与实现

目录 一、背景 二、限流概述 2.1 dubbo 服务治理模式 2.1.1 dubbo框架级限流 2.1.2 线程池设置 2.1.3 集成第三方组件 2.2 springcloud 服务治理模式 2.2.1 hystrix 2.2.2 sentinel 2.3 网关层限流 三、常用限流策略 3.1 限流常用的算法 3.1.1 令牌桶算法 3.1.2 …

2023最新Java面试八股文汇总(五十万字总结版)

写在前面 今年的疫情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&a…

<Linux开发>驱动开发 -之- Linux RTC 驱动

&#xff1c;Linux开发&#xff1e;驱动开发 -之- Linux RTC 驱动 交叉编译环境搭建&#xff1a; &#xff1c;Linux开发&#xff1e; linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下&#xff1a; &#xff1c;Linux开发&#xff1e; -之-系统移植 uboot移植过程详细…

Dubbo【 Dubbo概念(什么是分布式系统、什么是RPC、核心组件、Zookeeper注册中心 )】(一)-全面详解(学习总结---从入门到深化)

目录 Dubbo概念_什么是分布式系统 什么是分布式 Dubbo概念_什么是RPC Dubbo概念_简介 Dubbo概念_核心组件 Dubbo配置开发环境_Zookeeper注册中心 Dubbo配置开发环境_管理控制台 Dubbo入门案例_需求介绍 Dubbo入门案例_配置开发环境 Dubbo入门案例_服务生产者配置…

VLC-QT源码编译(Windows10+VS2020+MSVC20019+QT5.15)

参考VLC-Qt的编译与使用 windows10VS2019qt5.15 下载源码 VLC-QT https://github.com/vlc-qt/vlc-qt可以通过git或者直接下载ZIP文件&#xff0c;但是里面的libvlc-header和packaging没有下载下来&#xff0c;需要再自行下载。 VLC https://download.videolan.org/vlc/las…

行为型模式--备忘录模式

目录 概述 结构 案例实现 “白箱”备忘录模式 总结&#xff1a; “黑箱”备忘录模式 优缺点 优点&#xff1a; 缺点&#xff1a; 使用场景 概述 又叫快照模式&#xff0c;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这…

zeromq的学习笔记

ctx_t 在创建ctx_t时&#xff0c;会设置以下参数 _io_thread_count io线程数默认是1 _max_sockets最大socket数是1023 _starting标识设置为true,此时socket还没有创建 _terminating设置为false,在调用zmq_ctx_term时该标识会设置为true _tag设置为ZMQ_CTX_TAG_VALUE_GOOD&…

mySql和VSC++

确认主机服务里的mysql服务已打开 使用组合键“winR”运行“services.msc”&#xff0c;进入本地服务窗口&#xff1b; 2.进入本地服务窗口后&#xff0c;在右侧服务列表中&#xff0c;查找到“ mysql ”服务选项&#xff1b; 3.查找到mysql服务选项后&#xff0c;双击打开mysq…

C++ 面向对象(3)——重载运算符和重载函数

C 允许在同一作用域中的某个函数和运算符指定多个定义&#xff0c;分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明&#xff0c;但是它们的参数列表和定义&#xff08;实现&#xff09;不相同。 当您调用一个重…

FDM3D打印系列——3、常用打印材料介绍

大家好&#xff0c;我是阿赵。 FDM3D打印机一般都可以支持多种打印材料的&#xff0c;下面来介绍一下几种常用的打印材料 一、PLA 使用FDM打印&#xff0c;最常见的材料就是PLA了 PLA&#xff08;Polylactic acid&#xff09;&#xff0c;中文名为生物降解塑料聚乳酸&#…