ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

函数中特殊的两个关键词“static“和”extern“和链式访问

函数中特殊的两个关键词“static“和”extern“和链式访问 本文讲清三个 C 语言高频考点static 的两种用法、extern 的作用、以及链式访问。配合内存分区图和运行截图看完就能懂。1“static”和“extern”*****先放一个很重要的图片static:给大家一组代码 大家先猜一下循环调用 5 次 test输出什么void test(){int n 2; // 普通局部变量n;printf(%d , n);}int main() {for (int i 0; i 5; i) {test();}return 0;}答案是结果是3 3 3 3 3每次都是 3。为什么因为n是局部变量存在栈区里参上方图片而每次调用 test就在栈区新建一个 n赋值为 2然后 变成 3打印完函数结束n 就被销毁了。下一次调用又新建一个新的 n跟上次那个没关系。所以每次都是 3。现在我只加一个单词static其他什么都没变大家再猜输出是什么void test(){static int n 2; // 只多了一个 staticn;printf(%d , n);}// main 完全一样答案是显而易见这次n并没有依次被销毁这里就是发挥了static在局部变量间的作用static的作用就是把这个变量从栈区搬到了静态区而静态区刚好有两个特点只初始化一次—— 第一次调用时 n2后面再调用这句static int n 2;就不执行了函数结束不销毁——n 一直留在静态区值保留着所以第一次调用n 从 2 变 3打印 3第二次n 已经是 3 了 变 4打印 4…… 一直到 7。所以 static 修饰局部变量本质就一句话改变了变量的存储位置从栈区搬到静态区从而延长了生命周期。但注意作用域没变它还是只能在 test 函数里用外面访问不到以上只是static在局部变量的作用。那么下面就是在全局变量函数的作用此图两个源文件并用 完全不影响函数调用说明普通的全局函数整个工程里所有文件都能用。编译没问题正常运行。现在加一个static在add前面现在我只在 add 前面加一个static其他什么都没变。再编译直接报LNK2019 无法解析的外部符号。什么意思就是链接的时候源 1.cpp 说我要用 add但是翻遍整个工程找不到这个函数为什么加了 static 就找不到了因为static把这个函数锁在源.cpp 里面了只允许当前文件用其他文件就算写了 extern 也访问不到。所以 static 有两个完全不同的作用千万别混修饰局部变量改存储位置从栈区搬到静态区只初始化一次修饰全局函数或全局变量限制作用域只能在当前源文件里用别的文件访问不到你可以理解成static 给全局的东西加了一把锁钥匙只有当前文件有。这时候大家应该就懂了static的作用至于extern的作用 其实就是如上两个跨文件使用全局变量时加上来调用变量 由于该代码我用的是函数而不是变量 这里就不给大家举例了 注意是用变量才必须需要加 给大家两个图片可以看出是函数时并不影响跨文件使用。2链式访问来给大家放一段代码猜猜输出printf(“%d\n”, printf(“%d\n”, printf(“%d\n”, 43)));答案是为什么是 43、3、2很多人第一反应是 43、43、43当然我第一反应也是如此要搞懂这个得先知道一把钥匙 ——printf 的返回值返回值 打印的字符个数\n 也算一个字符(由此就能知道为什么不是43 43 43要输出时当然从最内部开始最里面先执行打印43加换行\n一共 3 个字符所以返回 3内层返回的 3直接作为中间层的参数。打印3加换行一共 2 个字符所以返回 2中间层返回的 2作为最外层的参数。打印2加换行返回 2但这个返回值没人接了链条结束43 ← 最内层打的3 ← 中间层打的2 ← 最外层打的这就是 “链式访问”——一个函数的返回值当场作为另一个函数的参数像链条一样一环扣一环总结一下static 修饰局部变量 → 搬进静态区只初始化一次延长生命周期static 修饰全局变量 / 函数 → 锁在当前文件其他文件访问不到extern → 跨文件声明变量必须写函数可省略链式访问 → 函数返回值直接当另一个函数的参数从内往外算
返回列表