C语言-----函数中的变量

目录

1、局部变量与全局变量

1.1 局部变量 

1.2 全局变量 

2、变量的存储类别 

2.1 自动类型 (auto) 

2.2 寄存器类型 (register) 

2.3 静态类型 (static) 

2.4 外部类型 (extern) 


1、局部变量与全局变量

上一篇博客学到函数被调用前,该函数内的形参是不占用内存的存储单元的;调用以后,形参才被分配内存单元;函数调用结束,形参所占用的内存也将被回收,被释放。说明了形参只有在定义它的函数内才是有效的,离开该函数就不能再使用了。变量有效性的范围或者变量可以引用的范围,称为变量的作用域。不仅仅是形参变量,C 语言中所有的变量都有自己的作用域。按照变量的作用域范围可分为两种,即局部变量和全局变量。 

1.1 局部变量 

局部变量是函数内部定义的变量。局部变量只在函数内部有效,在这个范围之外是不能使用的。例如:

在函数 function 内定义了 3 个变量,x、y 为形参,f 为一般的变量。在 function 的范围中,x、y、f 都有效,或者说 x、y、f 等 3 个变量在函数 function 内是可见的。同理,变量 a、b 的作用域仅限于 main 函数内。

注意:函数内部使用的局部变量包括形式参数(形参)和函数体内定义的变量。

 关于局部变量作用域的说明:

(1) 主函数 main 中定义的变量(a、b)只在主函数中有效,并不是因为在主函数中定义,而在整个文件或程序中有效。因为主函数也是一个函数,它与其他函数是平行的关系。

(2) 不同的函数中可以使用相同的变量名,它们代表不同的变量,之间互不干扰。

(3) 在一个函数内部,还可以在复合语句中定义变量,这些变量只在本复合语句中有
效。

(4)如果局部变量的有效范围有重叠,则有效范围小的优先。例如:

1.2 全局变量 

与局部变量相反,在函数之外定义的变量称为全局变量。由于一个源文件可以包含一个或若干个函数,全局变量可以为本文件中的其他函数所共有,它的有效范围是从定义点开始,直到源文件结束,全局变量又称为外部变量。

全局变量作用范围是整个源文件。如果需要传递多个数据,除了使用函数值外,还可以借助于全局变量,因为函数的调用只能带回一个返回值,利用全局变量增加与函数联系的渠道,从函数内得到一个以上的返回值。全局变量的使用增加了函数之间传送数据的途径。在全局变量的作用域内,任何一个函数都可以引用该全局变量。但如果在一个函数中改变了全局变量的值,就能影响到其他函数相当于各个函数间有直接的传递通道。 如:

/*利用一个函数实现输入三个数,返回最小、最大值等功能*/
#include<stdio.h>
int min = 0;
int function()
{
	int max = 0;
	int a = 0, b = 0, c = 0;
	int temp = 0;
	printf("请输入三个数:>");
	scanf("%d %d %d", &a, &b, &c);
	if (a < b)
	{
		temp = b;
		b = a;
		a = temp;
	}
	if (a < c)
	{
		temp = c;
		c = a;
		a = temp;
	}
	if (b < c)
	{
		temp = c;
		c = b;
		b = temp;
	}
	max = a;
	min = c;
	return max;
}

int main()
{
	int m = function();
	printf("最大值为:%d\n最小值为:%d\n ", m, min);
	return 0;
}

程序通过函数返回最大值,而最小值则由全局变量进行传递。

注 意:①当局部变量与全局变量同名时,在局部变量的作用范围内,全局变量不起作用,即局部变量优先。 ②为了便于区别全局变量和局部变量,在 C 程序设计人员中有一个不成文的约定(但非规定):将全局变量名的第1个字母用大写表示。

在实际使用过程中,建议非必要时不要使用全局变量,原因如下:

(1) 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。

(2) 它使得函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名,就会出现问题,会降低程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的 “ 内聚性 ” 强、与其他模块的 “ 耦合性 ” 弱。模块的功能要单一(不要把许多互不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而使用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个封闭体,除了可以通过 “ 实参——形参 ” 的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。

(3) 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时,都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量,而多使用局部变量。

2、变量的存储类别 

变量值存在的时间( 即生存期 /生命周期) 来划分,可分为静态存储变量和动态存储变量。 

(1) 动态存储变量:是当程序运行进入定义它的函数或复合语句时才被分配存储空间,程序运行结束离开此函数或复合语句时,所占用的内存空间被释放。这是一种节省内存空间的存储方式。

(2) 静态存储变量:在程序运行的整个过程中,始终占用固定的内存空间,直到程序运行结束,才释放占用的内存空间。静态存储类别的变量被存放于内在空间的静态存储区。

说明:程序运行时的数据分别存储在静态存储区动态存储区静态存储区用来存放程序运行期间所占用固定存储单元的变量,如全局变量等。动态存储区用来存放不需要长期占用内存的变量,如函数的形参等。 

变量的存储类型具体来说可分为4种:自动类型(auto)、寄存器类型(register)、静态类型(static)和外部类型(extern)。自动类型、寄存器类型的变量属于动态变量;静态类型、外部类型的变量属于静态变量。 

2.1 自动类型 (auto) 

用自动类型关键字 auto 说明的变量称为自动变量。其一般形式为:

auto 类型 变量名;

自动变量属于动态局部变量,该变量存储在动态存储区。定义时可以加 auto 说明符,也可以省略。由此可知,之前所用到的局部变量都是自动类型的变量。自动变量的分配和释放存储空间的工作是由编译系统自动处理的。如:

int Sum(int x,int y)
{
    auto int z=0;
    z=x+y;
    return z;
}

解释:形参 x、y,变量 z 都是自动变量。在调用该函数时,系统给它们分配存储空间,函数调用结束时自动释放存储空间。

2.2 寄存器类型 (register) 

寄存器类型变量的存储单元被分配在寄存器当中,用关键字 register 说明。其一般形式为:

register 类型 变量名;

 如:

register int value;

寄存器变量是动态局部变量,是存放在 CPU 的寄存器或动态存储区中,可以提高存取的速度,因为寄存器的存取速度比内存快得多。该类变量的作用域、生存期与自动变量相同。如果没有存放在通用寄存器中,便按自动变量处理。

由于计算机中寄存器的个数是有限的,寄存器的位数也是有限的,所以使用 register 说明变量时要注意以下几点:

(1) 寄存器类型的变量不宜过多,一般可将频繁使用的变量放在寄存器中(如循环中涉及的内部变量),以提高程序的执行速度。

(2) 变量的长度应该与通用寄存器的长度相当,一般为 int 型或 char 型。

(3) 寄存器变量的定义通常是不必要的,现在优化的编译系统能够识别频繁使用的变量,并能够在不需要编程人员作出寄存器存储类型定义的情况下,就把这些变量放在寄存器当中。

2.3 静态类型 (static) 

静态类型的变量占用静态存储区,用 static 关键字来说明。其一般形式为:

static 类型 变量名;

如:

static int temp;

静态类型又分为静态局部变量和静态全局变量。C 语言规定静态局部变量有默认值:int 型等于0,float 型等于 0.0,char 型为0,静态全局变量也如此。而自动变量和寄存器变量没有默认值,值为随机数。

1. 静态局部变量 

定义在函数内的静态变量称为静态局部变量。关于静态局部变量的几点说明如下: 

1) 静态局部变量是存储在静态存储的,所以在整个程序开始时就被分配固定的存储单元整个程序运行期间不再被重新分配,故其生存期(生命周期)是整个程序的运行期间。

(2) 静态局部变量本身也是局部变量,具有局部变量的性质,即其作用域是局限在定义它的本函数体内的。如果离开了定义它的函数,该变量就不再起作用,但其值仍然存在,因为存储空间并未释放。

(3) 静态局部变量赋初值的时间是在编译段,并且只被赋初值一次,即使它所有的函数调用结束,也不释放存储单元。因此不管调用多少次该静态局部变量的函数,它仍保留上一次调用函数时的值。

2. 静态全局变量

在定义全局变量时前面也加上关键字 static,就是静态全局变量。

如果我们编写的程序是在一个源程序文件中实现,那么一个全局变量和一个静态全局变量没有区别的。但是,有时一个 C 源程序是由多个文件组成的,那么全局变量和静态全局变量在使用上是完全不同的,一个文件可以通过外部变量声明使用另一个文件中的全局变量,但却无法使用静态全局变量,静态全局变量只能被定义它的文件所独享。 

静态全局变量的特点: 

(1) 与全局变量基本相同,只是其作用范围(即作用域)是定义它的程序文件,而不是整个程序。

(2) 静态全局变量属于静态存储类别的变量,它在程序一开始运行时。就被分配固定的存储单元,所以其生存期是整个程序运行期间。

(3) 使用静态全局变量的好处,是同一程序的两个不同的源程序文件中可以使用相同名称的变量名,而互不干扰。

2.4 外部类型 (extern) 

在任何函数之外定义的变量都叫做外部变量。外部变量通常用关键字 extern 说明。其一般形式:

extern 类型 变量名;

 如:

extern int value;
extern float f;

在一个文件中定义的全局变量默认为外部的,即 extern 关键字可以省略。但是如果其他文件要使用这个文件中定义的全局变量,则必须在使用前用 “ extern ” 作外部声明,外部声明通常放在文件的开头。

注意:静态存储类型的作用域与外部存储类型相反,一旦定义为静态存储类型,就限制该变量只能在定义它的文件中使用,为文件作用域。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我会试着用C语言编写一个闪烁的爱心:#include<stdio.h> #include<stdlib.h>int main() { while(1) { printf("\n\t\t\t ♥ ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ ♥ \n"); system("pause"); system("cls"); printf("\n\t\t\t ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ ♥ \n"); printf("\n\t\t\t ♥ ♥ ♥ \n"); system("pause"); system("cls"); } return 0; } ### 回答2: 要写一个C语言实现的闪烁的爱心,可以借助于终端输出来模拟出闪烁的效果。下面是一个简单的实现思路: 1. 首先,我们需要准备好一个爱心的形状字符模板,这个模板可以由多个字符组成,例如: ``` .-"""-. ' ' / \ | | \ / '-...-' ``` 将这个模板以字符串的形式存储起来。 2. 接下来,我们编写代码来实现闪烁的效果。可以通过循环来控制爱心的闪烁次数,每次循环,先输出爱心字符模板,然后暂停一段时间,再把模板清空,再次暂停一段时间。可以使用`printf`来输出模板,使用`system("cls")`来清空模板。 3. 最后,将循环控制的次数设置为所期望的闪烁次数,即可得到一个闪烁的爱心效果。 下面是示例代码: ```c #include <stdio.h> #include <windows.h> void clearScreen() { system("cls"); } int main() { int blinkTimes = 10; // 闪烁次数 int blinkDuration = 500; // 闪烁间隔(毫秒) char heart[] = ".-\"\"\"-.\ '\ '\ \ \\ | | \\ / '-...-'"; for (int i = 0; i < blinkTimes; i++) { clearScreen(); printf("%s\n", heart); Sleep(blinkDuration); clearScreen(); Sleep(blinkDuration); } return 0; } ``` 以上示例代码使用`system("cls")`来清空屏幕,适用于Windows系统。如果是其他操作系统,可能需要使用不同的方法进行清空屏幕操作。 ### 回答3: 要实现一个闪烁的爱心,可以使用C语言的图形库进行编程。以下是使用C语言的图形库实现闪烁爱心的一种方法: 首先,我们需要使用图形库函数进行图形化绘制。在C语言,可以使用graphics.h头文件函数来创建图形窗口,并使用putpixel函数在图形窗口设置像素点的颜色。 接下来,我们需要绘制一个爱心的形状。可以使用一系列的直线和弧线来绘制一个心形图案。可以使用线函数line或者arc函数进行绘制。 在绘制完整的爱心形状后,为了实现闪烁效果,我们可以使用循环结构进行控制。在每次循环,可以通过改变爱心的颜色来实现闪烁效果。可以使用putpixel函数来设置爱心的颜色。可以在两种颜色之间来回切换。 我们可以设置一个变量来作为颜色的标志。在每次循环,根据颜色的标志来选择不同的颜色,并将标志取反以便下一次循环使用另一种颜色。 最后,为了让闪烁的爱心看起来更加逼真,我们可以使用延时函数来控制每次颜色切换的间隔。可以使用delay函数来实现延时。 总结起来,要实现一个闪烁的爱心,我们需要使用C语言的图形库进行图形绘制,绘制一个爱心形状,并在循环改变爱心的颜色来实现闪烁效果。通过延时函数控制颜色切换的间隔,使闪烁效果更加逼真。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值