首页 > 编程知识 正文

static局部变量和全局变量(static变量是全局变量)

时间:2023-05-04 23:24:18 阅读:76243 作者:390

c语言:静态作用(修饰函数、局部变量、全局变量)。

一、静态全局变量与普通全局变量有什么不同?

在说明全局变量(外部变量)之前加上static,即可构成静态全局变量。

全局变量本身是静态存储方法,静态全局变量当然也是静态存储方法。 两者的保存方法都没有区别。

这一区别在于,非静态全局变量的范围是整个源程序。 如果一个源程序由多个源文件组成,则非静态全局变量对每个源文件都有效。 静态全局变量限制作用域。 这意味着它只在定义变量的源文件中有效,不能在同一源程序的其他源文件中使用。 静态全局变量的范围仅限于一个源文件中,并且仅对该源文件中的函数通用,从而可以防止其他源文件中发生错误。

静态全局变量只初始化一次,不被其他文件单元引用;

二、静态局部变量和普通局部变量有什么区别?

将局部变量更改为静态变量后,更改保存方法将更改生存期。 将全局变量更改为静态变量会改变范围,限制使用范围。

静态局部变量被初始化一次,下次根据上次的结果值;

三、静态函数与普通函数有什么不同?

静态函数与普通函数作用域不同,仅在本手册中有。 仅用于当前源文件的函数必须描述为内部函数(静态限定函数),内部函数必须在当前源文件中描述和定义。 对于可以在当前源文件之外使用的函数,必须在头文件中说明使用这些函数的源文件中包含此头文件。

内存中只有一个静态函数,而常规函数在每次调用时维护一个副本。

四、静态的三个重要作用,首先是静态最主要的功能隐藏,其次是静态变量存储在静态存储中,因此具有持久性和默认值0。

1、隐藏

1.1同时编译多个文件时,所有没有静态前缀的全局变量和函数都是全局可见的。 为了理解这句话,我举例说明。 同时编译两个源文件。 一个是static_extern.c,另一个是static_main.c。

1.2static_main.c

#includestdio.h

语音主(语音) )。

{

扩展通道I; //externvariablemustbedeclaredbeforeuse

printf('%c ',I );

msg (;

返回0;

}

1.3static_extern.c

char i='A ';//全局可变

void msg () )

{

printf(Ilovebeijing! I Love hanyue! n ';

}

1.4编译执行

1.5“为什么static_extern.c中定义的全局变量I和函数msg在static_main.c中可用? 如上所述,所有没有静态前缀的全局变量和函数都具有全局可见性,并且可以访问其他源文件。 在此示例中,I是全局变量,msg是函数,并且都没有静态前缀,因此将为单独的源文件static_main.c显示。 添加静态时,其他源文件将隐藏。 例如,如果在定义I和msg之前添加静态,则static_main.c将无法看到它们。 利用此特性,可以在不同文件中定义同名函数和同名变量,而不必担心名称冲突。 静态可以用作函数和变量的前缀。 对函数来说,静态角色仅限于隐藏。

2、静态的第二个作用是保持变量的内容。 存储在静态数据区中的变量在程序开始执行后立即初始化,是唯一的初始化。 静态存储包含两种类型的变量:全局变量和静态变量。 但是,与全局变量相比,static可以控制变量的可见范围。 静态只是用于隐藏。 这样的使用方法不常见,举个例子吧。

2.1 static_main.c

#include stdio.h

intfun(void ) {

静态输入计数=10; //其实这个赋值语句没有被执行过

返回计数- -;

}

int count=1;

输入主(语音) )。

{

printf (全局 ttlocalstaticn );

for (; 计数=10计数)

printf(%dt ) t%dn )、count、fun );

返回0;

}

2.2编译执行

3、静态的第三个作用是默认初始化为0。 其实全局变量也有这个属性。 因为全局变量也存储在静态数据区域中。 在静态数据区域中,内存中所有字节的默认值为0x00,在某些情况下可以减少程序员的工作量。 例如,初始化稀疏矩阵时,可以将所有元素都设置为0,并为一些不是0的元素赋值。 静态定义将省略第一个设置为0的操作。 例如,要将字符数组用作字符串,每次在字符数组末尾加上“ 0”就很麻烦了。 如果静态定义字符串,则该字符串原本为“ 0”,因此可以省去此麻烦。 请做个小实验验证一下。

3.1 static_main.c

#include stdio.h

int a;

输入主(语音) )。

{

int i;

静态char str [ 10 ];

printf(integer:%d; string:(Begin ) %s ) end ) n ',a,str );

返回0;

}

2.2编译执行

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。