前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言里面那些你必须知道的常用关键字(详细讲解)

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

作者头像
鸽芷咕
发布2023-12-25 14:34:11
2050
发布2023-12-25 14:34:11
举报
文章被收录于专栏:C++干货基地C++干货基地

前言

  哈喽,各位铁汁们好啊!✨今天来给大家带来的是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是用来修饰变量和函数的

代码语言:javascript
复制
 1. 修饰局部变量-称为静态局部变量
 2. 修饰全局变量-称为静态全局变量
 3. 修饰函数-称为静态函数
静态局部变量

示例:

大家来来看这段代码

在这里插入图片描述
在这里插入图片描述
  • 局部变量
a

,在没有static修饰之前局部变量a是存放在栈区的。所以每次出局部范围就销毁(把空间还给操作系统)。然后,调用时重新创建初始化。

  • 那我们把局部变量a加上static关键字修饰成静态局部变量,会怎么样呢?
代码语言:javascript
复制
//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修饰成了静态局部变量
  • 但是他本质上还是个局部变量

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

静态全局变量

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

  • 整个工程
在这里插入图片描述
在这里插入图片描述

可以看到只要在一个工程内,不同.c文件之间只要 (声明)也可以调用。

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

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

在这里插入图片描述
在这里插入图片描述

说明 static 修饰全局变量

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

static修饰函数和修饰全局变量是一样

在这里插入图片描述
在这里插入图片描述

用static修饰函数了之后

在这里插入图片描述
在这里插入图片描述

说明: 用static修饰函数

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

#define 定义常量和宏

#define 定义常量
代码语言:javascript
复制
#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 定义宏

我们来看一下宏是怎么定义的:

在这里插入图片描述
在这里插入图片描述

和定义函数非常相识

在这里插入图片描述
在这里插入图片描述

但是宏没有函数的返回类型和参数类型 还是很不一样的,宏的实现体一般都是表达式

那么宏是怎么调用的呢?和函数有什么区别嘞?
代码语言:javascript
复制
//宏
#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 顾名思义是类型定义,这里应该理解为类型重命名。 示例:

代码语言:javascript
复制
//将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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 章节目录
    • 序言
      • 1. C/C++中内存大致分的三个区域
        • 2. 关键字static
          • 静态局部变量
          • 静态全局变量
          • 静态函数
        • #define 定义常量和宏
          • #define 定义常量
          • #define 定义宏
        • 关键字 typedef
          • 总结
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档