常见的关键字有以下这些,但值得注意的是,c语言提供了丰富的关键字,这些关键字是语言本身预定好了的,用户自己是不能创造关键字的
关键字大致可以这样来初步分类
我们详细探究一下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有三种用法:
先看下面这个代码1
#include <stdio.h> void test() { int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } return 0; }
输出结果为10个1;
代码2:用static修饰后:
#include <stdio.h> 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; }
输出结果是1到10,那么为什么是这样呢?
首先我们要先复习一个知识点:
局部变量是有作用域的,当局部变量出了作用域后,就会实现销毁。
在代码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语言的学习中,内存分为三大块;
栈区,静态区,堆区;
static修饰局部变量
static 修饰局部变量的时候
本来一个局部变量是存放在栈区的,如果被static修饰就存储到静态区了
static 修饰局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束才结束
但是作用域不变
下来看第二种用法:
先看这个代码:
int main() { printf("%d\n", g_val); return 0; }
int g_val = 2023;
在外部文件创建一个全局变量:
运行结果:
说明方法不对,用外部文件需要声明外部符号
//声明外部符号 extern int g_val;
此时运行结果:
那要是用static修饰结果会是什么?
会报错,原因就是:
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; }
运行结果:
跟修饰全局变量一样,也是报错;原因就是:
static修饰函数
static 修饰函数和static修饰全局变量是一样的
函数是具有外部链接属性的,但是被static修饰,就变成了内部链接属性
使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用的
这就是static的三个用法。
留个题目结束本篇文章叭:
下面代码的结果是什么??
#include <stdio.h> 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)); } }