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

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

前言

  哈喽,各位铁汁们好啊!✨今天来给大家带来的是C语言中我们常用的关键字静态static的详细讲解和typedef#define定义常量和宏。

  既然是详解想必大家必定是想学一些平常学不到的东西吧!这里博主给大家详细讲解static修饰的变量在内存重视如何存储的,顺带给大家讲一下C/C++中的内存大致分为几个区域是如何存储的!废话不说了上干货

序言

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

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

2. 关键字static

在C语言中:

  • static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
 2. 修饰全局变量-称为静态全局变量
 3. 修饰函数-称为静态函数

静态局部变量

示例:

大家来来看这段代码

  • 局部变量 a aa,在没有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 aa 本来是存放在栈区的,但是由于被修饰成静态变量所以被存放在静态区了。

  • 静态区变量的特点:
  • 创建好后,直到程序结束才销毁

这里说明了:

静态变量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#definetypedef

总结一下今天学了:

  关键字static

  关键字static修饰变量的作用域变化

  #define定义的宏和常量

  关键字typedef

不知道大家掌握了没有,希望对各位铁汁有用呢!

看到这里了还不给博主扣个点赞收藏

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。


目录
相关文章
|
2月前
|
存储 数据可视化 编译器
【C语言】union 关键字详解
联合体(`union`)是一种强大的数据结构,在C语言中具有广泛的应用。通过共享内存位置,联合体可以在不同时间存储不同类型的数据,从而节省内存。在嵌入式系统、硬件编程和协议解析等领域,联合体的使用尤为常见。理解和正确使用联合体可以使代码更加高效和灵活,特别是在内存受限的系统中。
120 3
【C语言】union 关键字详解
|
2月前
|
编译器 C语言
【C语言】extern 关键字详解
`extern` 关键字在C语言中用于跨文件共享变量和函数的声明。它允许你在一个文件中声明变量或函数,而在其他文件中定义和使用它们。理解 `extern` 的使用可以帮助你组织和管理大型项目的代码。
225 3
|
2月前
|
C语言
【C语言】break 关键字详解
- `break` 关键字用于提前退出循环体或 `switch` 语句的执行。 - 在 `for`、`while` 和 `do-while` 循环中,`break` 可以帮助程序在满足特定条件时退出循环。 - 在 `switch` 语句中,`break` 用于终止 `case` 代码块的执行,避免代码“穿透”到下一个 `case`。 - 注意 `break` 只会退出最内层的循环或 `switch` 语句,确保在嵌套结构中正确使用 `break` 以避免意外的控制流行为。
150 2
|
2月前
|
传感器 安全 编译器
【C语言】enum 关键字详解
`enum`关键字在C语言中提供了一种简洁而高效的方法来定义一组相关的常量。通过使用枚举,可以提高代码的可读性、可维护性,并减少错误的发生。在实际应用中,枚举广泛用于表示状态、命令、错误码等,为开发者提供了更清晰的代码结构和更方便的调试手段。通过合理使用枚举,可以编写出更高质量、更易维护的C语言程序。
149 2
|
2月前
|
缓存 安全 编译器
【C语言】volatile 关键字详解
`volatile` 关键字在 C 语言中用于防止编译器对某些变量进行优化,确保每次访问该变量时都直接从内存中读取最新的值。它主要用于处理硬件寄存器和多线程中的共享变量。然而,`volatile` 不保证操作的原子性和顺序,因此在多线程环境中,仍然需要适当的同步机制来确保线程安全。
89 2
|
2月前
|
存储 编译器 程序员
【C语言】auto 关键字详解
`auto` 关键字用于声明局部变量的自动存储类,其作用主要体现在变量的生命周期上。尽管现代C语言中 `auto` 的使用较少,理解其历史背景和作用对于掌握C语言的存储类及变量管理仍然很重要。局部变量默认即为 `auto` 类型,因此在实际编程中,通常不需要显式声明 `auto`。了解 `auto` 关键字有助于更好地理解C语言的存储类及其在不同场景中的应用。
99 1
|
2月前
|
C语言
【C语言】continue 关键字详解
`continue` 关键字在 C 语言中用于跳过当前循环中的剩余代码,并立即开始下一次迭代。它主要用于控制循环中的流程,使程序在满足特定条件时跳过某些代码。
165 1
【C语言】continue 关键字详解
|
2月前
|
存储 C语言
【C语言】static 关键字详解
`static` 关键字在C语言中用于控制变量和函数的作用域和生命周期。它可以用于局部变量、全局变量和函数,具有不同的效果。理解 `static` 关键字的用法有助于封装和管理代码,提高代码的可维护性和可靠性。
98 3
|
2月前
|
C语言
【C语言】return 关键字详解 -《回家的诱惑 ! 》
`return` 关键字在 C 语言中用于终止函数的执行,并将控制权返回给调用者。根据函数的类型,`return` 还可以返回一个值。它是函数控制流中的重要组成部分。
118 2
|
2月前
|
C语言
【C语言】sizeof 关键字详解
`sizeof` 关键字在C语言中用于计算数据类型或变量在内存中占用的字节数。它是一个编译时操作符,对性能没有影响。`sizeof` 可以用于基本数据类型、数组、结构体、指针等,了解和正确使用 `sizeof` 对于内存管理和调试程序非常重要。
109 2

热门文章

最新文章