C语言中那些你必须知道的常用关键字

 更新时间:2023年06月27日 16:27:36   作者:鸽芷咕  
这篇文章主要介绍了C语言中我们常用的关键字静态static的详细讲解和typedef 、#define定义常量和宏,感兴趣的小伙伴可以跟随小编一起学习一下

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

静态区变量的特点:

创建好后,直到程序结束才销毁

这里说明了:静态变量a在程序编译的时候就自动创建好了,并且已经完成初始化了

而没有修饰呢:

没有修饰之前必须进入函数体中初始化语句才会完成初始化。

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

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

所以,静态变量的生命周期是整个工程。

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

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

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

静态全局变量

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

整个工程

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

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

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

说明:static 修饰全局变量

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

静态函数

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

用static修饰函数了之后

说明:用static修饰函数

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

3.#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这个宏替换成这样

而函数调用是

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

4.关键字 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;
}

到此这篇关于C语言中那些你必须知道的常用关键字的文章就介绍到这了,更多相关C语言关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VC外部符号错误_main,_WinMain@16,__beginthreadex解决方法

    VC外部符号错误_main,_WinMain@16,__beginthreadex解决方法

    这篇文章主要介绍了VC外部符号错误_main,_WinMain@16,__beginthreadex解决方法,实例分析了比较典型的错误及对应的解决方法,需要的朋友可以参考下
    2015-05-05
  • C语言的循环小练习详解

    C语言的循环小练习详解

    这篇文章主要为大家介绍了C语言的循环小练习,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C++错误使用迭代器超出引用范围问题及解决方案

    C++错误使用迭代器超出引用范围问题及解决方案

    这篇文章主要介绍了C++错误使用迭代器超出引用范围分析与解决,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • C语言中注释与注意事项的深入讲解

    C语言中注释与注意事项的深入讲解

    在编写C语言源代码时,应该多使用注释,这样有助于对代码的理解,这篇文章主要给大家介绍了关于C语言中注释与注意事项的相关资料,需要的朋友可以参考下
    2021-09-09
  • VS2022实现VC++打包生成安装文件图文详细历程

    VS2022实现VC++打包生成安装文件图文详细历程

    本文主要介绍了VS2022实现VC++打包生成安装文件图文详细历程,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C实现的非阻塞方式命令行端口扫描器源码

    C实现的非阻塞方式命令行端口扫描器源码

    这篇文章主要介绍了C实现的非阻塞方式命令行端口扫描器源码,对于大家理解C端口扫描器有很大帮主,需要的朋友可以参考下
    2014-07-07
  • Qt利用ImageWatch实现图片查看功能

    Qt利用ImageWatch实现图片查看功能

    Visual Studio有专门针对OpenCV开发的插件,名叫ImageWatch,图片放大之后可以查看RGB的像素值。本文将利用这一查件实现图片查看功能,需要的可以参考一下
    2022-04-04
  • C++智能指针之shared_ptr的具体使用

    C++智能指针之shared_ptr的具体使用

    本文主要介绍了C++智能指针之shared_ptr的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-05-05
  • C++实现LeetCode(160.求两个链表的交点)

    C++实现LeetCode(160.求两个链表的交点)

    这篇文章主要介绍了C++实现LeetCode(160.求两个链表的交点),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c++基础算法动态DP解决CoinChange问题

    c++基础算法动态DP解决CoinChange问题

    这篇文章主要为大家介绍了c++基础算法如何利用动态DP来解决Coin Change的问题示例过程,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10

最新评论