[讨论] 20260310每日一思

jiaol2021   2026-3-10 23:10 楼主

不能在函数的形参中使用static

int wontwork(static int flu); //不允许

回复评论 (9)

用const可以吗?意思是不允许修改?不是其他什么呢?
点赞  2026-3-11 07:26

参数需要每次调用独立    

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2026-3-11 09:12

嗯嗯 

static int flu 需要在函数体里面定义。 

点赞  2026-3-11 10:42

呀,我回复这么晚嘛?

 

有些问题确实需要更多的思考,我不得不翻开我的小本本,看看我当年的感悟。

 

上次提到,*和&是一对好兄弟,这让我想到,static也不孤独。

 

请出static的好基友之前,让我们回忆一下,全局变量和局部变量,我更愿意把他们描述为静态变量临时变量

 

可以简单认为变量只有两种:静态的和临时的,他们都在内存里。

我们的内存空间,可以简单理解成有两大部分:指令区和数据区

数据区又可以大致分为两个部分:静态区域和临时区域

有人可能会说:不对,应该是常量区、全局变量区、堆区、栈区。

其实究其本质来说,常量往往和指令区在一起,而堆和栈都是开辟在内存里的数据结构,所以怎么区分他们不重要,接下来的事情才重要。

 

静态的变量,从程序运行的一刻起,他就有自己在内存中的地址,有一个固定的初始值,从开始运行到程序结束,这个地址只为他一人所用。

 

临时的变量,使用栈里的空间,共享单车的模式,没有自己的固定的地址,用的时候CPU分配这块内存归他所用,不用的时候,这内存就归别人啦。这种变量连初始值也没有,拿来用的时候你如果没有对他初始化,他有可能是任何值,取决于之前用的人往里面写了什么。

 

大部分人学的时候,接触到的都是:局部变量在栈区里。但是……局部变量一定是临时变量吗?如果局部变量不是临时的,他还会在栈区里吗?

 

好了,接下来有请static和他的好基友:extern

我有时为了偷懒,我会说成:static和extern都是咱们用来修饰静态变量的修饰语,他们修饰的变量都是静态。

 

又有人说了:不对啊,局部变量也可以用static。

可是你仔细想想,当你用了static,那变量还是临时的吗?

 

所以我会给我的徒弟们讲:变量只有静态变量临时变量

接下来重点来了:

static和extern都用来修饰静态变量。

static的功能是限制静态变量的作用域,限制到什么程度?只有当前变量所在的那一层之内可以访问,换句话说,他所在的花括号以内(写在所有函数外的,你可以认为当前文件就是他所在的那一层了)。

extern用来放大静态变量的作用域,放大到什么程度?其他文件也可以使用。

 

需要补充说明的是实际用法,写在全局的时候,无论变量还是函数,默认是完全全局可用的(extern),但是定义的时候不写extern,而是需要使用的地方,用extern声明,表明这个变量或函数来自于其他的文件。

只有需要约束他的作用域,才会在定义的时候,明确写明static,用来把他捆在定义的区域。

 

所以现在你看到了:static和extern实际是作用域修饰符,修饰的都是静态的变量。

而静态和临时,与全局和局部,根本就是两个不同的概念。

 

回到你的思考,函数的参数,不能用static修饰?

当然了,因为参数从来就不是静态的变量!

 

非遗古法手工编程
点赞  2026-3-11 15:21
引用: sjtitr 发表于 2026-3-11 15:21 呀,我回复这么晚嘛?   有些问题确实需要更多的思考,我不得不翻开我的小本本,看看我当年的感 ...

讲的循序渐进,每次读完都有感悟,感谢!

点赞  2026-3-12 09:08
引用: lugl4313820 发表于 2026-3-11 07:26 用const可以吗?意思是不允许修改?不是其他什么呢?

const应该是可以的;按照sjtitr老师说的,因为形参是临时变量,static修饰静态变量,也就是让变量拥有静态存储器,所以矛盾导致没法修饰。

点赞  2026-3-12 09:15
引用: 秦天qintian0303 发表于 2026-3-11 09:12 参数需要每次调用独立    

哦哦,好的

点赞  2026-3-12 09:15
引用: codingtuzi 发表于 2026-3-11 10:42 嗯嗯  static int flu 需要在函数体里面定义。 

明白了

点赞  2026-3-12 09:15

‘不能在函数的形参中使用static’

 

作用域不同:

static变量是在运行中一直存在的。

函数的形参只在函数内部起作用。

 

使用方法:

函数要调用static可以直接在函数内部使用。

也可以用指针指向static变量。

本帖最后由 damiaa 于 2026-3-12 09:36 编辑
点赞  2026-3-12 09:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复