Advertisement

C语言中static的用法总结

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本文档全面总结了C语言中关键字static的各种使用方法和作用,包括文件范围内的静态变量、函数以及局部静态变量等,帮助程序员深入理解并灵活应用static特性。 C程序的存储空间布局主要包括以下几个部分: 1. 正文段:包含CPU执行的机器指令;每个程序只有一个副本,并且是只读的,以防止由于意外事故导致自身代码被修改。 2. 初始化数据段(也称为数据段):存放所有在程序中赋了初始值的全局变量。 3. 非初始化数据段(bss段):包含未进行初始化的所有全局变量;内核会将这些变量设置为0。 4. 栈:自动增长,主要用于存储函数调用时所需的临时信息和局部变量。栈的增长方向是从高地址向低地址增加的。 5. 堆:用于动态分配内存的空间。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • Cstatic
    优质
    本文档全面总结了C语言中关键字static的各种使用方法和作用,包括文件范围内的静态变量、函数以及局部静态变量等,帮助程序员深入理解并灵活应用static特性。 C程序的存储空间布局主要包括以下几个部分: 1. 正文段:包含CPU执行的机器指令;每个程序只有一个副本,并且是只读的,以防止由于意外事故导致自身代码被修改。 2. 初始化数据段(也称为数据段):存放所有在程序中赋了初始值的全局变量。 3. 非初始化数据段(bss段):包含未进行初始化的所有全局变量;内核会将这些变量设置为0。 4. 栈:自动增长,主要用于存储函数调用时所需的临时信息和局部变量。栈的增长方向是从高地址向低地址增加的。 5. 堆:用于动态分配内存的空间。
  • C##符号
    优质
    本文总结了C语言中#和##预处理符的使用方法及其在宏定义中的作用,帮助读者更好地理解和运用这些特殊符号。 在C语言编程中,预处理器宏是一种强大的工具,在编译阶段进行文本替换操作。`#` 和 `##` 是这两种特殊符号中的两个重要组成部分。 首先来看 `#` 操作符的用法:它将宏参数转换为字符串字面量。例如: ```c #define STR(s) #s ``` 当使用 `STR(vck)` 时,该宏会被展开成 `vck` 字符串形式。 接下来是 `##` 的功能介绍:用于连接两个宏参数,形成一个新的单一标识符。举个例子来说: ```c #define CONS(a, b) int(a##e##b) ``` 这里的 `a` 和 `b` 会被拼接在一起生成新的标识符。调用如 `CONS(2, 3)` 将会创建一个整型常量,即 `(int)(2e3)` 或者是数值 `2000`. 但是需要注意的是,在宏参数本身为另一个宏定义的情况下,使用 `#` 和 `##` 操作符时会导致该参数不再进一步展开。例如: ```c #define TOW 2 #define MUL(a, b) (a * b) ``` 在此情况下调用 `MUL(TOW, TOW)` 将不会将 `TOW` 展开为数字 `2`, 而是直接使用宏名作为参数,导致输出结果为 `(2) * (2)`。 为了防止这种情况发生,可以引入一个中间转换的宏来确保所有参数在与 `#` 或者 `##` 结合之前先被展开。例如: ```c #define _STR(s) #s #define STR(s) _STR(s) #define _CONS(a, b) int(a##e##b) #define CONS(a, b) _CONS(a, b) ``` 这样,使用宏定义如 `STR(INT_MAX)` 和 `CONS(A, A)` 将会正确地展开为期望的形式。 此外,`#`和`##`还有一些其他的应用场景。例如: ```c #define ___ANONYMOUS1(type, var, line) type var##line #define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line) #define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__) ``` 上述代码片段用于生成匿名变量名,其中`__LINE__`宏代表当前的行号。例如: ```c static int ANONYMOUS(static int); ``` 将会定义一个名为 `int_anonymous70;` 的静态整型变量(假设该语句出现在第 70 行)。 另一个例子是使用 `##` 操作符填充结构体成员,如下所示: ```c #define FILL(a) {a, ``` 这个宏可以用于初始化匿名数组的元素。例如: ```c FILL(10) FILL(20)} ``` 将生成 `{10, 20, }` 的结构体初始化语法。 总而言之,`#` 和 `##` 是C语言中预处理操作符的重要组成部分,允许在宏定义内执行字符串化和标识符拼接等复杂文本转换任务。正确使用这些操作符对于编写高效灵活的代码是至关重要的。
  • Cstatic与extern使详解
    优质
    本文详细解析了C语言中的static和extern关键字用法及其作用机制,帮助读者深入理解变量和函数的作用域及生命周期。 在大型项目中,我们经常会遇到多个源文件。例如,在a.c 文件中有以下代码: ```c static int i; int j; void init(void) { static void init() // 此处函数声明应为:static void init() 只在 a.c 文档中使用 void callme(void) { static int sum; // 全局变量sum的作用域仅限于callme函数内 ``` 其中,全局变量`i`和函数`init()`只可以在a.c文件内部使用。而全局变量`j`以及函数`callme()`的定义则可以扩展到整个项目中的所有源文档中。 因此,在另一个b.c 文件中可以通过声明为 `extern int j; extern void callme(void);` 来引用这些外部已定义的变量和函数,告诉编译器它们在其他文件里已经被定义。
  • C静态变量static.pdf
    优质
    本文档详细解析了C语言中的静态变量(static)及其多种作用,包括延长变量生命周期、限制作用域等特性,适合希望深入理解C语言编程细节的技术人员阅读。 在C语言中,`static`关键字具有多种重要功能,主要体现在修饰局部变量、全局变量以及函数上。 #### 1. 修饰局部变量 当使用 `static` 来声明一个位于函数内部的局部变量时,该变量会成为静态局部变量。与普通局部变量不同的是,静态局部变量只在第一次进入其所在函数时初始化一次,并且在整个程序运行期间都保存着这个值。即使函数退出后,它的值仍然保留下来,在下一次调用函数时可以继续使用之前的值。 ##### 示例代码及分析 考虑以下示例: ```c #include void func() { static int i = 0; int j = 0; i++; j++; printf(i: %d, j: %d\n, i, j); } int main() { func(); func(); return 0; } ``` 在这个例子中,`func()` 函数有两个变量:静态局部变量 `i` 和普通局部变量 `j`。每次调用函数时,虽然 `j` 的值会重置为零,但 `i` 的值会被累加并保留下来。 输出结果如下: ``` i: 1, j: 1 i: 2, j: 1 ``` 这表明静态局部变量在多次调用函数时保持其状态不变。 #### 2. 修饰全局变量 如果一个全局变量被声明为 `static`,它就成为了一个静态的全局变量。这种类型的变量仅限于定义它的源文件内使用,并且不能通过其他文件中的外部引用(如使用 `extern` 关键字)访问到。这增强了程序封装性并减少了命名冲突的可能性。 ##### 示例代码及分析 在某个 `.c` 文件中: ```c static int a = 10; static void msg() { printf(This is a static function.\n); } ``` 尝试从另一个文件引用这些定义会失败,因为它们是静态的,并且作用域仅限于其所在的源文件。 #### 3. 修饰函数 声明为 `static` 的函数在全局范围内使用时,只在其被定义的那个编译单元(即一个 `.c` 文件)内可见。这意味着其他文件中的代码无法直接调用这个函数。这种做法有助于隐藏实现细节和减少不同模块间的耦合度。 ##### 示例代码及分析 考虑以下结构: - `sub.c` ```c static void myFunc() { printf(This is a static function in sub.c.\n); } ``` - 在另一个文件中尝试调用该函数会失败,因为其作用域仅限于定义它的源文件。 ### 总结 `static` 关键字在C语言中的主要用途是控制变量或函数的存储期(生命周期)和可见性。这种特性对于提高程序可维护性和避免命名冲突等方面非常有用。通过合理使用 `static`,开发人员可以更好地管理程序状态与数据访问权限,并构建出更加健壮且高效的软件系统。
  • C指针
    优质
    本文章全面总结了C语言中的指针概念与应用技巧,包括指针基础、数组和字符串操作以及函数参数传递等方面的知识点。 指针是C语言中的难点,也是其精华所在。本段落档列举了指针使用过程中常见的注意事项及易混淆的知识点对比,旨在帮助初学者更好地掌握指针的运用,提供清晰的学习思路。
  • C指针
    优质
    本文是对C语言中指针概念和应用的一次全面回顾与总结,涵盖了指针的基本操作、数组与字符串处理、函数参数传递等关键知识点。 C 语言中的指针是一种特殊的变量类型,用于存储内存地址。掌握指针对于深入学习 C 语言至关重要。 1. 变量的指针与指向变量的指针变量 一个指针变量用来存放某个特定类型的变量在内存中的地址。例如,在声明 `int *pointer;` 中,`pointer` 是一个可以保存整型变量地址的特殊类型变量。注意这里的星号(*)表示 pointer 是个指针而非直接存储数值;因此不能写成 `*pointer` 来访问值本身。 2. 定义指针 定义形式为:数据类型 * 指针名,例如 `int *p;` 这里 p 就是一个可以保存整型变量地址的指针。一个特定类型的指针只能指向相同类型的数据。 3. 使用指针引用内存中的值 使用 & 和* 两个操作符来实现:& 是取址运算符,比如对于变量 a, `&a` 表示获取其存储位置;而 * 则是解引用(或称间接访问)运算符,用于通过地址读取实际的数值。 4. 数组与指针 数组名实质上代表了整个数组的第一个元素的位置。例如:定义一个整型数组 int a[5] 之后,a 就成为了指向第一个元素位置的常量指针。可以通过将这个名称赋值给另一个同类型的指针来访问它的各个成员。 5. 指向多维数组 对于二维或更高维度的数据结构来说,可以使用一个单一的指针变量来表示整个数据集或者其中的一部分(如最外层的一行)。 6. 字符串处理中的指针应用 在 C 语言中字符串通常以字符数组的形式存在;同时也可以用字符型指针来指向这一系列连续存储位置的第一个元素。例如,`char *str = Hello, World!`; 这里 str 只保存了起始地址而非整个序列。 7. 字符串作为函数参数 当把一个字符串传递给某个需要处理文本的 C 函数时,实际上就是将该数组或指针指向其开头位置传入。 8. 分析字符数组与字符指针的区别: - 数组是固定的元素集合而指针仅包含地址信息。 - 初始化数组需使用 `static` 关键字;初始化指针则不需要特别操作。 - 不能直接给一个定义为固定大小的字符数组赋值整个字符串,但可以这样做来设置指向该字符串首部的指针变量。 理解这些基本概念有助于更有效地利用 C 语言进行编程。
  • Cmath.h函数
    优质
    本文档对C语言中的数学库`math.h`进行了全面总结,涵盖了常用的数学函数及其使用方法,旨在帮助编程学习者和开发者快速掌握并应用这些函数。 C语言中math.h函数总结,列出了该语言中使用的数学计算函数。
  • C外显符extern使
    优质
    本文档全面总结了C语言中extern关键字的应用方法与技巧,帮助开发者更好地理解和运用该关键字来提高编程效率。 C语言中的extern关键字用于声明一个变量或函数已经在其他文件中定义,并且在当前文件中使用它。这有助于实现不同源代码文件之间的数据共享。 1. **变量的外部链接**:当在一个源文件中定义了一个全局变量,但需要在另一个源文件中访问该变量时,可以使用extern关键字声明这个变量。 例如,在`fileA.c`中有: ```c int globalVar = 5; ``` 在`fileB.c`中想要引用它,则应该这样声明: ```c extern int globalVar; ``` 2. **函数的外部链接**:当一个函数在另一个文件中被定义,而当前文件需要调用这个函数时,可以使用extern来声明该函数。 假设`fileA.c`中有这样的函数: ```c void someFunction() { // 函数体 } ``` 如果想从`fileB.c`中调用它,应该这样声明: ```c extern void someFunction(); ``` 3. **注意事项**:使用extern时需要注意的是,变量或函数的定义必须出现在文件中的某个地方。如果只是声明而没有定义,则会导致链接错误。 4. **头文件的应用**:为了便于管理和减少重复代码,在实际开发中通常会将extern声明放在相应的头文件(如`header.h`)里,并在需要引用这些全局变量和外部函数的源文件(`.c`或`.cpp`)中包含该头文件。这样可以确保所有相关的定义都被正确地链接到一起。 总结来说,extern关键字是C语言实现跨文件数据共享的重要工具之一,在编写大型程序时尤其有用。
  • C构体链表排序方
    优质
    本篇文章详细介绍了在C语言编程环境中,如何对包含复杂数据类型的结构体链表进行有效的排序。通过多种经典算法实现和比较,帮助读者理解和掌握链表排序的关键技术和优化策略。 C语言结构体链表的排序方法汇总 功能:选择排序(由小到大) 返回:指向链表表头的指针 选择排序的基本思想是从还未排好序的部分节点中,反复选出键值最小的节点(这里我们使用学号num作为键值),并将这些节点重新组合成一个有序的新链表。在编写这类程序时,关键是要理解head存储的是第一个节点的地址,而head->next则存储第二个节点的地址;任意一个中间节点p只能通过其前驱结点的next指针来获取其位置信息。
  • C常见算.pdf
    优质
    本PDF文档全面总结了C语言中的常用算法,旨在帮助编程学习者和开发者巩固基础、提高代码编写能力。文件中包含丰富的示例代码与详细注释,涵盖排序、查找等经典算法。 本段落归纳了C语言中的常用经典算法,包括基本的排序、查找、字符处理及数值计算等内容,并为每种算法提供了详细的文字说明和使用例程,非常适合初学者学习参考。