02_C语言变量的介绍,使用。

一.全局变量:

    全局变量在整个程序中都是可见的,可以在任何函数内部使用。生命周期:它们在程序开始时创建,在程序结束时销毁。全局变量的作用域从声明的位置一直持续到文件的末尾。在函数中使用全局变量,一般应作全局变量说明 只有在函数内经过说明的全局变量才能使用。

C语言——全局变量的定义与声明_全局声明-CSDN博客

c语言中的局部变量和全局变量_c语言全局变量-CSDN博客

二.局部变量:

   局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。注意:当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化

c语言中的局部变量和全局变量_c语言全局变量-CSDN博客

 三.作用域规则:

    1.就近原则(Lexical Scoping):
     在嵌套的作用域中,变量的访问按照就近原则。也就是说,程序会优先查找最内层的作用域,如果找不到变量,就会逐级向外查找。

    2.同名变量:
    在不同的作用域中,可以使用相同的变量名,因为它们处于不同的作用域,不会发生冲突。同名变量在不同的作用域中是相互独立的。

   3.局部变量优先:
如果在局部作用域中有一个与全局作用域中同名的变量,那么在局部作用域中的变量会优先使用,而全局变量会被隐藏。

  4.块作用域(Block Scope):
在C99标准及以后的版本中,块作用域可以在任意代码块(花括号{}内)内声明变量。这意味着在if语句、for循环等结构中声明的变量只在该结构内部可见。

变量的访问和赋值规则可参考此文章:https://blog.csdn.net/m0_64265903/article/details/122051670#:~:text=%E5%8F%98%E9%87%8F%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E5%88%86%E4%B8%BA%E4%B8%A4%E7%A7%8D

四.常见作用域:

1.局部作用域:
在函数内部或代码块内声明的变量具有局部作用域。它们只在声明它们的函数或代码块内可见,出了这个范围就无法访问。这有助于限制变量的使用范围,防止在其他地方被误用或篡改。

2.全局作用域:
在函数外部声明的变量具有全局作用域。它们在整个程序中都是可见的。全局变量的生命周期从程序开始到结束。

include <stdio.h>
 
/* 全局变量声明 */
int g = 20;
 
int main ()
{
  /* 局部变量声明 */
  int g = 10;
 
  printf ("value of g = %d\n",  g);
 
  return 0;
}
//在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值
//输出:
      value of g = 10

3.块作用域:
块作用域是指在一对花括号 {} 内声明的变量。这些变量只能在该块及其嵌套的块中访问

{
    int x = 10;  // x 具有块作用域
    printf("%d\n", x);
}
// 在此处无法访问 x

4.函数参数作用域:
函数参数的作用域是在函数内部。参数在函数内部可以被引用,但在函数外部无法访问。
如:

#include <stdio.h>

void exampleFunction(int parameter) {
    // 在函数内部,可以访问参数 parameter
    printf("Function parameter: %d\n", parameter);

    // 尝试访问其他函数内部的参数,这是错误的
    // printf("Trying to access another parameter: %d\n", anotherParameter); // 错误,无法访问 anotherParameter
}

int main() {
    int anotherParameter = 42; // 主函数内的变量,不同于函数参数

    // 在调用函数时,传递参数值
    exampleFunction(anotherParameter);

    return 0;
}

5.作用域嵌套:
在C语言中,作用域可以嵌套。在内部作用域声明的变量可以隐藏外部作用域声明的同名变量。
如 :

#include <stdio.h>

int main() {
    int x = 5; // 外部作用域的变量

    printf("Outer x: %d\n", x);

    if (x > 0) {
        // 内部作用域开始
        int x = 10; // 内部作用域的同名变量,隐藏了外部作用域的 x
        printf("Inner x: %d\n", x);

        
    }
    
    // 内部作用域结束,内部作用域的 x 不再可见
    printf("Outer x after block: %d\n", x);

    return 0;
}

五.变量的存储类型:


在程序中经常会使用到变量,在C程序中可以选择变量的不同存储形式,其存储类别分为静态存储和动态存储。可以通过存储类别修饰符来告诉编译器要处理什么样的类型变量,具体主要有自动(auto)、静态(static)、寄存器(register)和外部(extern)4种。
什么是静态存储指程序运行时为其分配固定的存储空间。
什么是动态存储:在程序运行期间根据需要动态地分配存储空间。

 

1.auto变量:


auto关键字用于定义一个局部变量为自动的,这意味着每次执行到定义该变量时,都会产生一个新的变量,并且对其重新进行初始化
关键字auto时可以省略的,如果不特别指定,局部变量的存储方式默认为自动的

#include <stdio.h>
#include <stdlib.h>

void add_one(void)
{
    auto int num = 1; /*定义auto整型变量*/

    num = num + 1; /*变量加1*/

    printf("%d\n", num); /*显示结果*/
}

int main(void)
{
    printf("第一次调用:");
    add_one(); /*调用add_one函数*/

    printf("第二次调用:");
    add_one(); /*调用add_one函数*/

    return EXIT_SUCCESS; /*程序结束*/

2.static变量:


在C语言中: static是用来修饰变量和函数的,有以下几种
1. 修饰局部变量
-称为静态局部变量
2. 修饰全局变量
-称为静态全局变量
3. 修饰函数
-称为静态函数
 

static修饰局部变量:改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
 

#include <stdio.h>
void test()
{
	//static int i = 0;
	int i = 0;
	i++;
	printf("%d ", i);
}

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

结果:

当在局部变量添加static修饰时:
 

#include <stdio.h>
void test()
{
	static int i = 0;
	i++;
	printf("%d ", i);
}

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

结果:

可以看到static改变了变量的生命周期,使其能够持续的累加,如果不添加stati修饰,那么当每次调用test()这个函数时,创建的变量内存空间都会被释放.

static修饰全局变量:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使

用。

//add.c文件
int g_val = 2018;


//test.c文件
int main()
{   extern int g_val;
    printf("%d\n", g_val);
    return 0; }



//代码2
//add.c
static int g_val = 2018;

//test.c
int main()
{   extern int g_val;
    printf("%d\n", g_val);
    return 0; }

运行之后可以报错:

改变了变量的作用域 - 让静态的全局变量只能在自己所在的源文件内部使用出了源文件就没法再使用了。

3.static修饰函数:

//add.c文件

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


//test.c
#include <stdio.h>
int main()
{
	extern int Add(int,int);
	printf("%d\n", Add(2, 3));
	return 0;
}

运行上述代码会报错。static修饰函数也是改变了函数的作用域但这说法不准确确切的说static修饰函数改变了函数的链接属性。外部链接属性 -> 内部链接属性。

3.register变量:

register变量称为寄存器存储类变量。通过register变量,可以把某个局部变量指定存放在计算机的某个硬件寄存器中,而不是内存中。这样做的好处是可以提高程序的运行速度。实际上,编辑器可以忽略register对变量的修饰

用户无法获得寄存器变量的地址,因为绝大多数计算器的硬件寄存器都不占用内存地址。而且,即使编辑器忽略register,而把变量存放在可设定的内存中,也是无法获取变量的地址的。

如果想有效地利用register关键字,必须像汇编语言那样了解处理器的内部结构,知道可用于存放变量的寄存器的数量、种类以及工作方式。但是,不同的计算机对于这些细节可能是不同的,因此,对于一个要具备可移植的程序来说,register的作用并不大
 

#include <stdlib.h>

int main(void)
{
    register int num = 100; /*定义寄存器整型变量*/

    printf("%d\n", num); /*显示结果*/

    return EXIT_SUCCESS; /*程序结束*/
}

4.extern变量:

extern的部分用法总结:

      1.引用同一个文件中的变量

      2.引用不在同一个文件中的变量或者函数

      3.引用另一个文件中的函数

extern的相关用法可参考:https://zhuanlan.zhihu.com/p/348762602#:~:text=%E5%88%A9%E7%94%A8%E5%85%B3%E9%94%AE%E5%AD%97exter

六.生命周期:

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值