C语言static与全局变量解析及易错点

需积分: 10 0 下载量 121 浏览量 更新于2024-07-14 收藏 923KB DOCX 举报
"此文档主要涵盖了C语言的部分关键知识点和易混淆题目,包括static关键字的使用、变量的作用域、函数调用中的参数传递等核心概念。" 在C语言中,`static`关键字扮演着重要的角色。当在一个函数内部声明一个静态变量时,这个变量将保留其在多次函数调用之间的值,即它的生命周期跨越了函数调用的边界。而在全局范围内声明静态变量,会使得该变量仅在当前源文件内可见,避免了命名冲突,同时也保持了其在程序执行期间的持久性。 C/C++不允许函数内部嵌套定义其他函数,同样,结构体内部也不能有同名的结构体成员。这是为了保证代码的清晰性和编译器的处理效率。例如,如果在一个函数内部定义另一个函数,那么内部函数的生命周期和作用域将会变得复杂,可能导致难以预料的结果。 在C语言中,参数传递通常是按值进行的,这意味着函数内部对参数的修改不会影响到函数外部的变量。然而,当传递的是指针时,情况有所不同。例如,表达式`*s-- += 7; p[1]`涉及到指针和指针所指向的值。这里的`s--`是对指针自身的操作,使指针向后移动一位;而`*s`是解引用操作,它影响的是指针所指向的值。要注意的是,`p[1]`并不等同于`*(p+1)`,前者实际上是解引用后的`s`加上7,而后者则是将指针`p`向前移动一位然后解引用。 关于字符串操作,如果子串只包含两个字符,处理起来相对简单。但要注意,`p[i]++`这样的表达式并不意味着移动指针`p`,而是将指针`p`指向的字符增加1,即`*(p+i)`。若要使指针本身前进,应使用`p++`。 全局变量的作用域从定义它的位置开始,一直到文件结束或遇到相同名字的局部变量为止。在复合语句(如大括号包围的代码块)中定义的变量,其作用域仅限于该复合语句。主函数虽然特殊,但本质上仍是一个函数,其中的变量也是局部变量,它们仅在主函数内部有效。 函数参数传递时,如果传递的是地址,那么函数可以修改该地址所指向的值,但不能改变地址本身。也就是说,地址传递改变了变量的内容,而不是变量的地址。因此,理解这些基础知识对于编写正确和高效的C语言程序至关重要。