C语言 - 再谈变量

局部变量:

  • 函数内声明的,函数的形参,代码块内。(直接{}内有效)

全局变量:

  • 声明在函数外的变量,在整个.c文件有效

初始值:

  • 局部变量:系统不会对其默认初始化,必须对局部变量初始化后才能使用,否则,程序运行后可能会异常退出。
  • 全局变量:如果没有显式初始化,它们会被自动、默认初始化为零或空值,具体取决于数据类型。
数据类型 默认初始化值
int 0
char ‘\0’ 或 0
float 0.0f
double 0
指针 NULL

在内存中的位置:

  • 局部变量:保存在中,函数被调用时才动态地为变量分配存储单元。
  • 全局变量:保存在内存的全局存储区中,占用静态的存储单元。

存储方式:

函数4

说明:

1、对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。

2、对不是静态局部变量赋初值,不是在编译时进行的,而是在函数调用时进行的,且每调用一次函数就执行一次赋值语句。

变量修饰符:

  1. 寄存器变量:(register变量)

    • register int f; //定义f为寄存器变量
    • 寄存器存储在CPU中的寄存器中,因此这样做可以提高执行效率。
  2. extern修饰变量:

    • 格式:extern 数据类型 变量名;
    • extern int globalVar; // 声明一个外部变量 globalVar
    • extern 用于声明外部变量或函数,告诉编译器变量或函数在其他文件中定义。
    • 使用 extern 可以实现跨文件共享变量。
    • 注意区分声明和定义,extern 声明不能初始化
  3. const修饰变量:

    1. 在C语言中,const 关键字用于创建常量,它指示编译器将标识符(变量、参数、函数等)视为不可修改的值

    2. 格式:const int i=10; 变量 i 的值不可修改

    3. 指向常量的指针:(值不能被修改)常量指针

      1
      2
      3
      4
      5
      int num=10;
      const int *ptr =#
      //*ptr=20;报错
      int num1=20;
      ptr=&num1;//没有报错

      ptr 是一个指向常量整数的指针,这意味着你可以使用 ptr 访问整数 x,但不能通过 ptr 修改x的值。

      const 只限制 *ptr 不能修改,而 ptr 本身的地址是可以修改的。

      方便记忆:const在 p前面,限制的是p,而p还可以修改,也就是不能修改值但是可以指向其他

    4. 指针常量:

      1. 把 const 放在 ptr 前面,此时即为常量指针

      2. 格式:int *const ptr;

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        void func3() {

        int num1 = 10;
        int *const ptr = &num1;

        int num2 = 20;
        ptr = &num2; //报错

        *ptr = 20; //未报错
        }
        • 方便记忆:const在 p前面,限制的是p,而p还可以修改,也就是不能修改指向其他,但是可以修改值p
    5. 常量参数:

      1
      2
      3
      void func4(const int param) {
      param = 20; //报错
      }
      • param 是一个常量参数,这意味着在函数内部不能修改传递给它的参数的值。
    6. 常量数组:

      1
      2
      3
      4
      5
      6
      void func5() {
      const int arr[] = {1, 2, 3, 4};

      arr[0] = 10; //报错
      arr[1] = 20; //报错
      }
      • arr 数组被声明为一个包含整数常量的数组。这表示数组的每个元素都是常量,不能被修改。
    7. 常量结构体:

      1
      2
      3
      4
      struct Point {
      const int x;
      const int y;
      };
      • 在结构体声明中使用 const 可以创建包含常量成员的结构体,这表示结构体的每个成员都不能被修改。

小结:

函数5

参考链接: