哈喽,各位铁汁们好啊!✨今天来给大家带来的是C语言中我们常用的关键字静态
static
的详细讲解和typedef
、#define
定义常量和宏。 既然是详解想必大家必定是想学一些平常学不到的东西吧!这里博主给大家详细讲解static
修饰的变量在内存重视如何存储的,顺带给大家讲一下C/C++
中的内存大致分为几个区域是如何存储的!废话不说了上干货
在C语言中:
static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
示例:
大家来来看这段代码
,在没有static
修饰之前局部变量a是存放在栈区的。所以每次出局部范围就销毁(把空间还给操作系统)。然后,调用时重新创建初始化。
//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在程序编译的时候就自动创建好了。并且已经完成初始化了 而没有修饰呢:
没有修饰之前必须进入函数体中初始化语句才会完成初始化。
前面我们说了静态变量是创建完成后,直到程序结束才销毁。 所以
而静态局部变量的作用域呢?
所以他的作用域不变还是它所在的局部范围
我们都这样全局变量的作用域是
可以看到只要在一个工程内,不同.c
文件之间只要
(声明)也可以调用。
但是我们用static
关键字修饰成静态全局变量看看
说明 static 修饰全局变量
static修饰函数和修饰全局变量是一样
用static修饰函数了之后
说明: 用static修饰函数
#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 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;
}
我们可以看到宏的调用也和函数产不多 但是
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
不知道大家掌握了没有,希望对各位铁汁有用呢!
看到这里了还不给博主扣个点赞
加收藏
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。