首页 > 其他分享 >C语言里面那些你必须知道的常用关键字(详细讲解)

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

时间:2023-06-24 19:34:03浏览次数:41  
标签:变量 int 局部变量 C语言 关键字 static 讲解 修饰 静态

前言

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

在这里插入图片描述

(章节目录)

序言

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

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

在这里插入图片描述

2. 关键字static

在C语言中:

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

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

静态局部变量

示例:

大家来来看这段代码

在这里插入图片描述

  • 局部变量 $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修饰成了静态局部变量
  • 但是他本质上还是个局部变量

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

静态全局变量

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

  • 整个工程 在这里插入图片描述 <font color="red" size="4">可以看到只要在一个工程内,不同.c文件之间只要 (声明)也可以调用。</font>

  • 说明;

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

<font color = purple>但是我们用static关键字修饰成静态全局变量看看 </font> 在这里插入图片描述 说明 <font color = purple>static 修饰全局变量 </font>

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

静态函数

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

<font color = purple>用static修饰函数了之后 </font> 在这里插入图片描述 说明: <font color = purple>用static修饰函数 </font>

  • 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 定义宏

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

那么宏是怎么调用的呢?和函数有什么区别嘞?
//宏
#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;
}

<font color = purple>我们可以看到宏的调用也和函数产不多</font> 但是

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

  • int c = (a)+(b);在编译的时候就把ADD这个宏替换成这样 </br> 而函数调用是

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

关键字 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

不知道大家掌握了没有,希望对各位铁汁有用呢! 看到这里了还不给博主扣个点赞收藏

标签:变量,int,局部变量,C语言,关键字,static,讲解,修饰,静态
From: https://blog.51cto.com/u_16169367/6541510

相关文章

  • c语言-字符串+转义字符+注释、语句、函数、数组、操作符 2
    一、字符串+转义字符+注释字符串类型(相较于字符数据类型):eg:“”;//空字符串定义:由双引号引起的一串字符为字符串字面值,简称字符串。(后面默认会有\0,结束标志不算内容intmain(){chararr1[]="abc";//数组//"abc"——'a''b''c''\0'——'\0'......
  • HTML------常见的几种图片格式(GIF、PNG、JPG)讲解
    (1)GIF格式GIF格式最突出的特点是支持动画同时GIF是一种无损的图像格式,即修改图片之后,图片质量没有损失。GIF支持透明效果但只能处理256中颜色。因此在网页制作中,GIF格式常用于Logo、小图标和其他色彩相对单一的图像。(2)PNG格式 PNG包括PNG-8和真色彩(PNG-24和PNG-32)。相......
  • 初始C语言2
    学习感想今天一大早起来就开始看(肝)鹏哥的视频,三个小时半啊!!!从早上8点多到现在快13点,知道这三小时半我怎么过的吗?呜呜呜呜!但是终于坚持学完了这一个视频。这一次视频还是讲的很基础的内容,之前自己也涉及过,但也学到了不一样的东西,比如讲到常量时,不仅提到了我之前学过的常变量和定义标......
  • C语言 【阶乘】
    原#include<stdio.h>intmain(){intn;intsum=1;printf("输入数字:");scanf("%d",&n);for(inti=1;i<=n;i++){sum*=i;}printf("%d的阶乘为%d\n",n,sum);return0;......
  • C语言I/O操作
    (只写了文件调用的,C库自己看吧)1、系统调用定义:指操作系统提供给用户程序的调用的一组“特殊接口”,用户程序可以通过这组特殊接口来获得操作系统内核提供的服务2、Linux文件描述符当某个程序打开程序时,操作系统会返回相应的文件描述符,(相当于文件的别名,打开之后就只用......
  • C语言【三数中找最大值】
    原#include<stdio.h>intmain(){inta,b,c;printf("输入三个数:");scanf("%d%d%d",&a,&b,&c);if(a>b&&a>c){printf("最大值为:%d\n",a);}elseif(a>b......
  • 自学C语言2023_6_23
    字符串:字符串——一串字符,用双引号括起的一串字符(字符串的结束标志是一个\0的转义字符,在计算字符串长度的时候\0是结束标志,不算作字符串内容)  字符数组:字符数组——数组是一组相同类型的元素  求字符串长度:利用strlen函数求字符串长度: 转以字符:转义字符—......
  • 浏览器内核讲解
    浏览器内核是浏览器的核心部分负责解释网页语法并渲染网页,也叫渲染引擎。渲染引擎决定了浏览器如何显示网页内容和页面的格式信息。不同的浏览器内核对网页编写语法的解释也不相同,因此同一网页在不同内核的浏览器里的渲染效果也不同。 Trident内核代表IE浏览器,只能......
  • C++面试八股文:override和finial关键字有什么作用?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第22面:(二师兄好苦逼,节假日还在面试。。。)面试官:C++的继承了解吗?二师兄:(不好意思,你面到我的强项了。。)了解一些。面试官:什么是虚函数,为什么需要虚函数?二师兄:虚函数允许在基类中定义一个函数,然后在派生类中进行重写(override)。二......
  • 基于C语言的泛类型循环队列
    循环队列多用于通信数据缓存中,尤其是在双方设备接收数据与处理数据不同步的情况下,使用循环队列先缓存通信数据,然后按照时间戳数据出队作出相应的处理,是一种比较合适的做法,在嵌入式编程中亦是如此。使用循环队列的数据结构可以实现上述功能,在一些低端的编程平台手写一个循环队列既......