static 函数_static关键字的3种特性

点击上方公众号关注,获取更多技术分享

009281f5886fa738999c3531971c4fed.gif ✎ 编 者 悟 语

        我的期待从我能给出的地方开始,我的责任从我能感知的地方进行。

文 章 导 读

    今天给大家讲解了下static关键字的3个特性,每个特性都进行了代码验证,这样更有助于大家理解static的作用以及它的使用方法。

1static与变量

    静态类型变量包括全局变量(在函数之外定义的变量)和静态变量,它们都存放在程序的静态存储区中。

    通俗说明如下:

    全局变量:在函数之外定义的变量。

    局部变量:在函数内定义的变量,或定义的函数参量(函数参数)。

    静态变量:定义时由static修饰的的变量。

    static可以修饰全局变量、局部变量、函数。

2static作用1 ——默认初始化为“0”

    静态整型变量初始化数值为0,指针赋值为NULL,浮点数赋值为0.0..0,分别等价于将变量的值用=0或=NULL或=0.0进行赋值。

    NULL在很多编译器里定义为0。

    验证代码如下:

#include

int main(int argc, char *argv[])

{

static int sint;

static float sfloat;

static int *sp;

printf("静态整型变量sint的初始化值为:%d\n",sint);

printf("\n静态浮点型变量sfloat的初始化值为:%f\n",sfloat);

// 测试静态指针变量的初始化值

if (sp == NULL)

{

printf("\n静态指针变量sp的初始化值为:%d\n",sp);

}

return 0;

}

    运行结果如下:

d19edfc531f5cf5c9cae979039504afe.png

3static作用2——限定作用域

    用static修饰的函数,只能在定义的文件中使用,它的作用域被限制了,其他文件不能调用它。

    需要注意的是用static修饰的函数参数,在声明时参量尽量写上static,这个边缘地带,不要以身犯险。

    测试代码有三个文件,分别是var_test1.c,var_test2.h和var_test2.c,代码很简单,在var_test2.c中定义静态函数,我想在var_test1.c中调用,所以在var_test2.h中进行声明,但实际中编译就会报错。

    var_test1.c代码如下:

#include

#include "var_test2.h"

int main(int argc, char *argv[])

{

int tmp1,tmp2;

// // tmp1 = testfun1(1,2);

tmp2 = testfun2(1,2);

// // printf("\n静态函数作用域测试:%d\n",tmp1);

printf("\n静态函数作用域测试:%d\n",tmp2);

printf("静态浮点型变量sfloat的初始化值为:%d\n",sfloat);

return 0;

}

    var_test2.h中的代码如下:

#include

//extern static int testfun(int val1,int val2);

extern int testfun2(int val1,int val2);

extern float sfloat;

    var_test2.c中的代码如下:

#include

int sfloat;

static int testfun1(int val1,int val2)

{

return (val1 + val2);

}

int testfun2(int val1,int val2)

{

return (val1 + val2);

}

    上面代码三个注释行没取消注释时,可以看到,没有static修饰的函数testfun2是可以正常调用的。

    运行结果如下:

b4f74c9c38fcc3dbf55e17e36e695aaf.png

    将上面代码中的注释取消掉,用Dev-C++编译时会报如下错误。

3ea8ca6d0e6f4dbda074ecfd603eb59e.png

    错误定位到var_test2.h中。

    英文的意思是声明说明符中有多个存储类,也就是说extern和static都是存储类的关键词,不能放到一起用。类似的网上还有这样的问题用typedef和static放到一起也会报相同的错误。

    即下面的定义方式是错误的。

    typedef static int;

    一个静态函数在一个源文件中,我想在另一个源文件中用是不行的。因为头文件中的声明就编译不过,你不要想用.c文件直接包含.c文件哈,5a68bf8913a2c633c33d8970c707b121.png5a68bf8913a2c633c33d8970c707b121.png5a68bf8913a2c633c33d8970c707b121.png

4static作用3——只能初始化1次

    用static修饰的变量,只初始化一次,下次用到此变量,获得是上次的值。即初始化之后静态变量的值会保存上次的值,修改之后,再用到此变量就是上次修改的值了,这样主要是避免被再次初始化。

#include

int add(void);

// 定义全局变量

int cnt = 1;

int main(int argc, char *argv[])

{

for(; cnt <= 10;cnt++)

{

printf("\n%d\n", add());

}

return 0;

}

int add(void)

{

static cnt = 6;

return cnt--;

}

    运行结果如下:

fd9fecb1aaf048dde867af80c69d276d.png

    我程序中定义了一个全局变量cnt和同名的静态变量cnt,从上面的运行结果我们可以得出两个结论: 

<1> 当静态变量和全局变量同名时,全局变量会失效。

<2> 静态变量只会被赋值一次,后面会用上次的值。

总结

    今天给大家讲解并验证的static的三个作用,通过实例验证,大家对他会有更清晰的认识了吧,后面还会有C语言相关的内容,大家拭目以待吧,3d30a62740a0b062b4f7ff2736b5a3f7.png

    有问题可以后台留言交流,公众号18年后新申请的,文章后不支持留言功能的。

相关文章:

用结构体和指针模拟配置芯片引脚输出高低电平

C标准库函数sprintf和sscanf的使用

用Dev-C++生成dll动态链接库文件并用C代码调用

宏分类的妙用(排版开始用模板)

进化论——从函数指针到被结构封装的函数指针及参数的应用举例

专辑推荐:

Python技能专辑

C语言专辑

IDE调试专辑

软件推荐专辑

软实力专辑

扫码关注我们

92339c8d03708bf1946fa85107ca81da.png

165470c0f359ebadfa19a5779d2c7df6.gif Game Over!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值