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

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

常见的关键字有以下这些,但值得注意的是,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));
    }
}

相关文章
|
7月前
|
iOS开发 C++ MacOS
c++typedef关键字
c++typedef关键字
39 0
|
7月前
|
C++
C总结-关键字 static const extern
C总结-关键字 static const extern
46 0
|
2月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
69 10
|
4月前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
7月前
|
存储 Java C++
31.C#:关键字static
31.C#:关键字static
68 1
|
7月前
|
C语言
typedef 关键字
typedef 关键字。
28 1
关键字typedef
变量a是无符号整型数,它的变量类型为unsigned int 有点长,于是我们就将其变量类型重命名 typedef unsigned int uint; 即将unsigned int 赋予新名字:uint,更加简洁方便 重命名后可以直接使用新的类型名:uint b=20;
46 0
关键字static
延长局部变量的生命周期,缩小全局变量和函数的作用
54 0