static与const的区别
(一)static主要有三个作用:
1.修饰局部变量,成为静态局部变量
2.修饰全局变量,成为静态全局变量
3.修饰函数,成为静态函数
(1)修饰局部变量。成为静态局部变量
没有加static的情况
如果加了static会有什么变化呢?
栈区:存放局部变量和函数参数等的地方。栈区的作用范围过了之后会自动回收栈区分配的内存,不需要手动管理。
静态区:静态变量和全局变量所存储的区域,一旦静态区的内存被分配,直到程序全部结束之后才会被释放。
静态区这个换而言之:静态区的生命周期和程序的生命周期是一样的,出了作用范围不会被销毁(上面static int a =5)这个例子,相当于作用范围不变,但生命周期延长了。
那么上面那个例子我们也可以进行解释原理了:
static修饰局部变量时,实际改变的是变量的存储位置,原来在栈区,被修饰后放在了静态区。
所以说除了作用范围之后不会被销毁。
(2)static修饰全局变量
紧接着,我们知道引用别的文件里的全局变量需要extern这个函数,所以我们再test2.cpp这个文件里引用一下这个全局变量。
所以我们编译结果为:
但是如果我们再test1.cpp里面的全局变量前面加上static,我们可以看一下程序能否成功运行。
程序出错了.
我们看错误原因:无法解析的外部符号。
这是为什么啊,我们明明已经用了extern这个函数来调用外部文件里的那个全局变量了啊,为什么无法解析呢?
那肯定是static捣的鬼嘛,它在这里发挥了什么作用呢?
一个全局变量本来是具有外部属性的,但是被static修饰后,外部属性就变成了内部连接属性,只能在自己所在的源文件内使用,不能在其他文件内使用。
这样呢,被static修饰后的全局变量给我们的感觉是作用域变小了(只能在自己文件内部使用,不能在别的文件内使用),但实质是链接属性变了。
3.static修饰函数
完美的输出了我们想要的结果。
但如果我们在test2.c里面的Add函数里面加上static:
发生错误。
错误原因也是无法解析的外部符号。
错误呢,和上个修饰全局变量一样:
一个函数本来是具有外部连接属性的,但是被static修饰后,外部链接属性就变成了内部连接属性,只能在自己所在的源文件内部使用,不能在其他文件内部使用了。
(二)const的作用
如果把const放在变量类型名前,说明这个变量的值是保持不变的,该变量必须在定义时初始化,初始化后对它进行的任何赋值都是非法的。
1.const修饰常变量
例如:
int a=5;
a=6;
此时a的值被修改为6。
const int a=5;
此时变量a的值便可再被修改
若仍写a=6,则程序便会出现错误。
2.const修饰常量静态字符串
例如:
const char str[]="fdsafdsa";
如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,就可以更改。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。
Cypress961: 你好,例题一的答案应该是12吧,=的优先级更高,应该直接赋值了
CSDN-Ada助手: 恭喜您写了第16篇博客!标题看起来很有趣,我很期待阅读您的观点和见解。持续创作是非常了不起的,您在探索和分享技术问题方面的努力是值得称赞的。在下一步的创作中,我建议您可以考虑拓展一下标题中提到的“%d”和“%u”的相关问题。或许您可以深入探讨它们在编程中的具体应用,以及它们可能导致的问题和解决方案。再次恭喜您,并期待您未来更多的精彩博文!
CSDN-Ada助手: 恭喜您写了第18篇博客!标题“关于数组指针与指针数组”听起来很有深度。看到您一直持续创作,真是令人佩服。在这篇博客中,您探讨了数组指针和指针数组的关系,这是一个非常有价值的主题。我希望能看到您在接下来的博客中更深入地探讨这个主题,或者挑战一些更复杂的编程问题,以便我们能够进一步学习和理解。谢谢您的分享,并期待您未来的创作!
CSDN-Ada助手: 恭喜您撰写了第19篇博客!标题中提到的strlen、strcpy、strcat和strcmp函数是C语言中非常常用的字符串处理函数,对于初学者来说,深入理解它们的用法和特点是非常重要的。您的博客内容相信能给读者带来很多帮助和启发。 在下一步的创作中,我建议您可以进一步探讨这些函数的底层实现原理,比如strlen函数是如何计算字符串长度的,strcpy和strcat函数是如何实现字符串的复制和拼接的。这样的深入探究不仅能够加深您自己对这些函数的理解,也能够为读者提供更多有价值的知识。 希望您能继续保持创作的热情,我期待着您未来更多精彩的文章!谢谢您的分享!
CSDN-Ada助手: 恭喜您撰写了第20篇博客!标题为“C语言-qsort函数详解”,这篇博客内容看起来非常有深度和价值。您对qsort函数的详细解析让读者能够更好地理解和应用它,我从中受益匪浅。 继续保持创作的势头,您已经证明了自己在编程领域的专业知识和能力。下一步,我希望您能够进一步探索其他与C语言相关的主题,比如内存管理、指针操作等等。这些主题对于想要深入了解C语言的读者来说将是非常有帮助的。 谦虚地说,我期待着您未来更多的精彩博客,并期望从中继续学习到更多有价值的知识。加油!