常见关键字 typedef以及static的介绍

常见的关键字有以下这些,但值得注意的是,c语言提供了丰富的关键字,这些关键字是语言本身预定好了的,用户自己是不能创造关键字的

图片

关键字大致可以这样来初步分类

常见关键字 typedef以及static的介绍_第1张图片
我们详细探究一下typedef和static这两个关键字

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

c语言中,static有三种用法:
常见关键字 typedef以及static的介绍_第2张图片

先看下面这个代码1

#include 
void test()
{
	int i = 0;
	i++;
	printf("%d ", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

常见关键字 typedef以及static的介绍_第3张图片
输出结果为10个1;

代码2:用static修饰后:

#include 
void test()
{
	//static修饰局部变量
	static int i = 0;
	i++;
	printf("%d ", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

常见关键字 typedef以及static的介绍_第4张图片
输出结果是1到10,那么为什么是这样呢?

首先我们要先复习一个知识点:
常见关键字 typedef以及static的介绍_第5张图片
局部变量是有作用域的,当局部变量出了作用域后,就会实现销毁
在代码1中,for循环中每一次调用test函数,test函数调用结束的时候,i变量的生命周期就结束了,就会销毁i变量的值,下一次继续调用test函数,就又会重新创建i的变量,i的值继续被重建成0,然后再i++,所以运行结果会出现10个1;
但如果test函数被static修饰后,当第一次调用完后,a的值变成了1,第二次调用test函数的时候,就不会继续创建i的值,而是跳过i=0这步操作,直接实行i++;这就是因为局部变量被static修饰的时候,i的值在出作用域是并没有销毁i的值,所以下一次调用函数的值时候,第二次调用的时候i用的是第一次处理完后的值,也就是1;依次内推,就会是2,3,4,5,…;所以代码2的结果就是1到10;这就是static修饰局部变量

其次要知道,在c语言的学习中,内存分为三大块;
栈区,静态区,堆区;

常见关键字 typedef以及static的介绍_第6张图片

static修饰局部变量

static 修饰局部变量的时候
本来一个局部变量是存放在栈区的,如果被static修饰就存储到静态区了
static 修饰局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束才结束
但是作用域不变

下来看第二种用法:

先看这个代码:



int main()
{
	printf("%d\n", g_val);

	return 0;
}
int g_val = 2023;

在外部文件创建一个全局变量:

常见关键字 typedef以及static的介绍_第7张图片

运行结果:
在这里插入图片描述

说明方法不对,用外部文件需要声明外部符号

//声明外部符号
extern int g_val;

此时运行结果:
常见关键字 typedef以及static的介绍_第8张图片
那要是用static修饰结果会是什么?
常见关键字 typedef以及static的介绍_第9张图片

会报错,原因就是:

static修饰全局变量

全局变量具有外部链接属性,所以在其他源文件内部依然可以使用(方法要正确)
static修饰全局变量,改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性
这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了
感觉像是作用域变小了

第三种用法,static修饰函数:

static int Add(int x, int y)
{
	return (x + y);
}

extern int Add(int x, int y);

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int s = Add(a, b);
	printf("%d\n", s);

	return 0;
}

常见关键字 typedef以及static的介绍_第10张图片
运行结果:


跟修饰全局变量一样,也是报错;原因就是:

static修饰函数

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

这就是static的三个用法。

留个题目结束本篇文章叭:
下面代码的结果是什么??

#include 
int sum(int a)
{
    int c = 0;
    static int b = 4;
    c += 3;
    b += 2;
    return (a + b + c);
}
int main()
{
    int i;
    int a = 2;
    for (i = 0; i < 5; i++)
    {
        printf("%d,", sum(a));
    }
}

常见关键字 typedef以及static的介绍_第11张图片

常见关键字 typedef以及static的介绍_第12张图片

你可能感兴趣的:(c语言,c语言)