不能在函数的形参中使用static
int wontwork(static int flu); //不允许
嗯嗯
static int flu 需要在函数体里面定义。
呀,我回复这么晚嘛?
有些问题确实需要更多的思考,我不得不翻开我的小本本,看看我当年的感悟。
上次提到,*和&是一对好兄弟,这让我想到,static也不孤独。
请出static的好基友之前,让我们回忆一下,全局变量和局部变量,我更愿意把他们描述为静态变量和临时变量。
可以简单认为变量只有两种:静态的和临时的,他们都在内存里。
我们的内存空间,可以简单理解成有两大部分:指令区和数据区
数据区又可以大致分为两个部分:静态区域和临时区域
有人可能会说:不对,应该是常量区、全局变量区、堆区、栈区。
其实究其本质来说,常量往往和指令区在一起,而堆和栈都是开辟在内存里的数据结构,所以怎么区分他们不重要,接下来的事情才重要。
静态的变量,从程序运行的一刻起,他就有自己在内存中的地址,有一个固定的初始值,从开始运行到程序结束,这个地址只为他一人所用。
临时的变量,使用栈里的空间,共享单车的模式,没有自己的固定的地址,用的时候CPU分配这块内存归他所用,不用的时候,这内存就归别人啦。这种变量连初始值也没有,拿来用的时候你如果没有对他初始化,他有可能是任何值,取决于之前用的人往里面写了什么。
大部分人学的时候,接触到的都是:局部变量在栈区里。但是……局部变量一定是临时变量吗?如果局部变量不是临时的,他还会在栈区里吗?
好了,接下来有请static和他的好基友:extern
我有时为了偷懒,我会说成:static和extern都是咱们用来修饰静态变量的修饰语,他们修饰的变量都是静态。
又有人说了:不对啊,局部变量也可以用static。
可是你仔细想想,当你用了static,那变量还是临时的吗?
所以我会给我的徒弟们讲:变量只有静态变量和临时变量,
接下来重点来了:
static和extern都用来修饰静态变量。
static的功能是限制静态变量的作用域,限制到什么程度?只有当前变量所在的那一层之内可以访问,换句话说,他所在的花括号以内(写在所有函数外的,你可以认为当前文件就是他所在的那一层了)。
extern用来放大静态变量的作用域,放大到什么程度?其他文件也可以使用。
需要补充说明的是实际用法,写在全局的时候,无论变量还是函数,默认是完全全局可用的(extern),但是定义的时候不写extern,而是需要使用的地方,用extern声明,表明这个变量或函数来自于其他的文件。
只有需要约束他的作用域,才会在定义的时候,明确写明static,用来把他捆在定义的区域。
所以现在你看到了:static和extern实际是作用域修饰符,修饰的都是静态的变量。
而静态和临时,与全局和局部,根本就是两个不同的概念。
回到你的思考,函数的参数,不能用static修饰?
当然了,因为参数从来就不是静态的变量!
引用: sjtitr 发表于 2026-3-11 15:21 呀,我回复这么晚嘛? 有些问题确实需要更多的思考,我不得不翻开我的小本本,看看我当年的感 ...
讲的循序渐进,每次读完都有感悟,感谢!
引用: lugl4313820 发表于 2026-3-11 07:26 用const可以吗?意思是不允许修改?不是其他什么呢?
const应该是可以的;按照sjtitr老师说的,因为形参是临时变量,static修饰静态变量,也就是让变量拥有静态存储器,所以矛盾导致没法修饰。
引用: 秦天qintian0303 发表于 2026-3-11 09:12 参数需要每次调用独立
哦哦,好的
引用: codingtuzi 发表于 2026-3-11 10:42 嗯嗯 static int flu 需要在函数体里面定义。
明白了
‘不能在函数的形参中使用static’
作用域不同:
static变量是在运行中一直存在的。
函数的形参只在函数内部起作用。
使用方法:
函数要调用static可以直接在函数内部使用。
也可以用指针指向static变量。
本帖最后由 damiaa 于 2026-3-12 09:36 编辑