【C语言】static关键字的使用

目录

一、静态本地变量

1.1 静态本地变量的定义

1.2 静态本地变量和非静态本地变量的区别

二、静态函数

2.1 静态函数的定义

2.2 静态函数与非静态函数的区别

三、静态全局变量

3.1 静态全局变量的定义

3.2 静态全局变量和非静态全局变量的区别

四、静态结构体变量 

4.1 静态结构体变量

4.2 静态结构体变量与非静态结构体变量

4.3 题外话


一、静态本地变量

1.1 静态本地变量的定义

静态本地变量是指在函数或方法内部定义的变量,在每次函数或方法被调用时都会保持其值的持久性。静态本地变量与普通本地变量的不同之处在于它们只会被初始化一次,并且在函数或方法的不同调用之间保持其值不变。

1.2 静态本地变量和非静态本地变量的区别

1.初始化

静态本地变量在没有显式初始化的情况下,默认会被设置为0。

非静态本地变量在没有显式初始化的情况下,其成员变量的值默认情况下是未定义的,即不会自动被赋值为0。

2.作用域(这里可以类比静态本地变量与非静态本地变量)

静态本地变量count1在每次函数调用之间保持其值。

非静态本地变量count2在每次函数调用时都是新创建的,其值不会保持一致。

#include 

void counter() {
    static int count1; // 静态本地变量
    count1++;

    int count2=0; // 非静态本地变量
    count2++;

    printf("Count1: %d,", count1);
    printf("Count2: %d\n", count2);
}

int main() {
    counter(); 
    counter(); 
    counter(); 

    return 0;
}


二、静态函数

2.1 静态函数的定义

在函数声明前使用static关键字,将该函数声明为静态函数。静态函数只能在当前.c文件中使用,不能被其他.c文件中的函数调用。

#include 

// 静态函数
static int add(int a, int b) {//静态函数
    return a + b;
}

int main() {
    int num1 = 10;
    int num2 = 20;
    int sum = add(num1, num2);

    printf("Sum: %d\n", sum);

    return 0;
}

2.2 静态函数与非静态函数的区别

静态函数和非静态函数的区别?用言语和示例代码进行解释

 •静态函数和非静态函数在C语言中的区别主要体现在函数的作用域和可见性上。

  1. 静态函数的作用域限制在定义它的源文件内部,只能在同一个源文件内的其他函数中调用,不可以被其他源文件调用。非静态函数的作用域为整个程序,可以在该程序的任何地方调用。
  2. 静态函数的可见性仅限于定义它的源文件,其他源文件无法直接访问和调用该函数。非静态函数具有全局可见性,其他源文件可以通过函数声明来访问和调用该函数。

•静态函数和非静态函数,在同一个源文件内的其他函数中调用(正常运行)

#include
static int staticFunc(int a, int b) {//静态函数
    return a + b;
}
int nonStaticFunc(int a, int b) {//非静态函数
    return a - b;
}

int main() {
    int x = 10;
    int y = 5;
    
    int result1 = staticFunc(x, y);
    int result2 = nonStaticFunc(x, y);
    
    printf("Static Function Result: %d\n", result1);//Static Function Result: 15
    printf("Non-Static Function Result: %d\n", result2);//Non-Static Function Result: 5
    
    return 0;
}

•静态函数,被其他源文件调用(报错)

//static.c
#include

static int staticFunc(int a, int b) {
    return a + b;
}
//main.c
#include

static int staticFunc(int a, int b);

int main() {
    int x = 10;
    int y = 5;

    int result1 = staticFunc(x, y);
    printf("Static Function Result: %d\n", result1);

    return 0;
}

•非静态函数,被其他源文件调用(正常运行)

//non_static.c
#include

int nonStaticFunc(int a, int b) {
    return a - b;
}
#include

int nonStaticFunc(int a, int b);

int main() {
    int x = 10;
    int y = 5;

    int result2 = nonStaticFunc(x, y);
    printf("Non-Static Function Result: %d\n", result2);

    return 0;
}

三、静态全局变量

3.1 静态全局变量的定义

在函数外部使用static关键字声明的变量为静态全局变量,它们只能在当前文件中使用,其他文件无法访问。

#include 

// 声明静态全局变量
static int count = 0;

void func1() {
    count++;
    printf("func1: count = %d\n", count);
}
void func2() {
    count++;
    printf("func2: count = %d\n", count);
}

int main() {
    // 调用函数1和函数2,观察静态全局变量的变化
    func1();//func1: count = 1
    func2();//func2: count = 2
    func1();//func1: count = 3
    
    return 0;
}

3.2 静态全局变量和非静态全局变量的区别

1.初始化

静态全局变量在程序的生命周期内只被初始化一次。如果没有显示初始化,静态全局变量默认初始化为0。

非静态全局变量在程序的生命周期内可以被多次初始化。如果没有显示初始化,非静态全局变量默认初始化为0。

2.作用域范围

静态全局变量的作用域仅限于声明的文件内,不同文件内的同名静态全局变量是互相独立的。

非静态全局变量的作用域是整个程序,可以在程序的任何地方访问。

3.文件间的访问性

静态全局变量只能在声明的文件内访问

非静态全局变量可以在其他文件中使用extern关键字进行声明并访问。(extern int i;)


四、静态结构体变量 

4.1 静态结构体变量

静态结构体变量是指在程序运行时在静态存储区分配的结构体变量。静态存储区是程序运行时分配给全局变量和静态变量的存储区域,其生命周期从程序开始执行到结束。静态结构体变量的定义方式与普通结构体变量相同,但需要使用static关键字来声明。

static struct Person p1;

4.2 静态结构体变量与非静态结构体变量

1.初始化

静态结构体变量在没有显式初始化的情况下,默认会被设置为0。

非静态结构体变量在没有显式初始化的情况下,其成员变量的值默认情况下是未定义的,即不会自动被赋值为0。

2.作用域(这里可以类比静态本地变量与非静态本地变量)

静态结构体变量s1在每次函数调用之间保持其值。

非静态结构体变量s2在每次函数调用时都是新创建的,其值不会保持一致。

#include 

struct MyStruct {
    int value;
};

void myFunction() {
    static struct MyStruct s1;// 静态结构体变量
    s1.value++;

    struct MyStruct s2 = { 0 };// 非静态结构体变量
    s2.value++;

    printf("s1.value = %d,", s1.value);
    printf("s2.value = %d\n", s2.value);
}

int main() {
    myFunction();
    myFunction();
    myFunction();

    return 0;
}

4.3 题外话

 在进行AI查询过程中,由于“静态结构体成员变量”这个词走了点歪路,虽已更正,但仍做一小记:

1.C语言中,是不存在“静态结构体成员变量”的说法的。

2.区分结构体成员变量与结构体变量

#include 

// 定义结构体
struct Person {
    char name[20];
    int age;
};

int main() {
    // 声明一个结构体变量
    struct Person person;

    // 访问结构体的成员变量并赋值
    strcpy(person.name, "John");
    person.age = 25;

    // 打印结构体的成员变量
    printf("Name: %s\n", person.name);
    printf("Age: %d\n", person.age);

    return 0;
}

这个例子中,struct Person定义了一个名为Person的结构体,其中有两个成员变量nameage。在main函数中,我们声明了一个名为person的结构体变量,并使用.运算符来访问结构体的成员变量,并对其进行赋值。最后,我们使用printf函数打印出结构体的成员变量的值。 

你可能感兴趣的:(C语言,C语言-学习小记,c语言,算法,开发语言)