C语言函数知识点大全(三)

简介: 教程来源 https://www.xcfsr.cn/article/81.html 本文详解C语言函数高级特性:静态函数(限本文件使用)、外部函数(跨文件调用)、可变参数函数(如sum、printf模拟)、以及变量作用域与生命周期(局部/全局/静态/寄存器变量),辅以典型代码示例,助你深入理解模块化编程与内存管理。

七、静态函数与外部函数

7.1 静态函数

// file1.c
#include <stdio.h>

// 静态函数:只在当前文件可见
static void helperFunction(void) {
    printf("这是静态函数,只能在当前文件使用\n");
}

// 普通函数:可以被其他文件使用
void publicFunction(void) {
    helperFunction();  // 可以调用静态函数
    printf("公共函数\n");
}

// 静态函数常用于:
// 1. 内部辅助函数
// 2. 模块内部实现细节
// 3. 避免命名冲突
// file2.c
#include <stdio.h>

// 声明外部函数
extern void publicFunction(void);
// extern void helperFunction(void);  // 错误:无法访问其他文件的静态函数

int main() {
    publicFunction();  // 可以调用
    // helperFunction();  // 编译错误
    return 0;
}

7.2 外部函数

// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

// 函数声明(默认是extern)
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
double divide(int a, int b);

#endif
// math_utils.c
#include "math_utils.h"

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

double divide(int a, int b) {
    return b != 0 ? (double)a / b : 0.0;
}
// main.c
#include <stdio.h>
#include "math_utils.h"

int main() {
    printf("10 + 5 = %d\n", add(10, 5));
    printf("10 - 5 = %d\n", subtract(10, 5));
    printf("10 * 5 = %d\n", multiply(10, 5));
    printf("10 / 5 = %.2f\n", divide(10, 5));
    return 0;
}

八、可变参数函数

#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>

// 计算多个整数的和
int sum(int count, ...) {
    va_list args;
    int total = 0;

    va_start(args, count);

    for (int i = 0; i < count; i++) {
        total += va_arg(args, int);
    }

    va_end(args);
    return total;
}

// 格式化输出到字符串(类似sprintf)
int mySprintf(char* buffer, const char* format, ...) {
    va_list args;
    va_start(args, format);
    int result = vsprintf(buffer, format, args);
    va_end(args);
    return result;
}

// 查找最大值
int findMax(int count, ...) {
    va_list args;
    va_start(args, count);

    int maxVal = va_arg(args, int);
    for (int i = 1; i < count; i++) {
        int val = va_arg(args, int);
        if (val > maxVal) maxVal = val;
    }

    va_end(args);
    return maxVal;
}

// 可变参数函数的遍历
void printAll(const char* format, ...) {
    va_list args;
    va_start(args, format);

    while (*format) {
        switch (*format) {
            case 'i': {
                int val = va_arg(args, int);
                printf("%d ", val);
                break;
            }
            case 'f': {
                double val = va_arg(args, double);
                printf("%.2f ", val);
                break;
            }
            case 's': {
                char* val = va_arg(args, char*);
                printf("%s ", val);
                break;
            }
            case 'c': {
                // char被提升为int
                int val = va_arg(args, int);
                printf("%c ", val);
                break;
            }
        }
        format++;
    }
    printf("\n");

    va_end(args);
}

int main() {
    printf("sum(5): %d\n", sum(5, 10, 20, 30, 40, 50));
    printf("sum(3): %d\n", sum(3, 100, 200, 300));

    char buffer[256];
    mySprintf(buffer, "Name: %s, Age: %d", "张三", 25);
    printf("格式化结果: %s\n", buffer);

    printf("最大值: %d\n", findMax(5, 10, 30, 20, 50, 40));

    printAll("iis", 10, 20, "Hello");
    printAll("fci", 3.14, 'A', 100);

    return 0;
}

九、函数作用域与生命周期

9.1 局部变量

#include <stdio.h>

void function1(void) {
    // 局部变量:在函数内定义,只在函数内可见
    int localVar = 10;
    static int staticVar = 0;  // 静态局部变量

    localVar++;
    staticVar++;

    printf("localVar = %d, staticVar = %d\n", localVar, staticVar);
}

// 块级作用域
void blockScope(void) {
    int x = 10;

    if (x > 0) {
        int y = 20;  // 只在if块内可见
        printf("x=%d, y=%d\n", x, y);
    }

    // printf("%d\n", y);  // 错误:y在此处不可见
}

int main() {
    function1();  // localVar=11, staticVar=1
    function1();  // localVar=11, staticVar=2
    function1();  // localVar=11, staticVar=3

    blockScope();

    return 0;
}

9.2 全局变量

#include <stdio.h>

// 全局变量:在整个程序中都可见
int globalVar = 100;

// 静态全局变量:只在当前文件可见
static int fileStaticVar = 200;

// 外部全局变量声明
extern int externalVar;  // 在其他文件中定义

void printGlobals(void) {
    printf("globalVar = %d\n", globalVar);
    printf("fileStaticVar = %d\n", fileStaticVar);
    printf("externalVar = %d\n", externalVar);

    // 可以修改全局变量
    globalVar++;
}

int main() {
    printGlobals();
    printGlobals();
    return 0;
}

9.3 寄存器变量

#include <stdio.h>

// 寄存器变量:建议编译器将变量存储在CPU寄存器中
// 用于频繁访问的变量
void registerVariableDemo(void) {
    register int counter = 0;

    for (register int i = 0; i < 1000000; i++) {
        counter++;
    }

    printf("Counter: %d\n", counter);
    // 不能对寄存器变量取地址
    // int* p = &counter;  // 错误
}

来源:https://www.xcfsr.cn/article/81.html

相关文章
|
10天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
11162 103
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
9天前
|
人工智能 IDE API
2026年国内 Codex 安装教程和使用教程:GPT-5.4 完整指南
Codex已进化为AI编程智能体,不仅能补全代码,更能理解项目、自动重构、执行任务。本文详解国内安装、GPT-5.4接入、cc-switch中转配置及实战开发流程,助你从零掌握“描述需求→AI实现”的新一代工程范式。(239字)
5705 136
|
8天前
|
人工智能 并行计算 Linux
本地私有化AI助手搭建指南:Ollama+Qwen3.5-27B+OpenClaw阿里云/本地部署流程
本文提供的全流程方案,从Ollama安装、Qwen3.5-27B部署,到OpenClaw全平台安装与模型对接,再到RTX 4090专属优化,覆盖了搭建过程的每一个关键环节,所有代码命令可直接复制执行。使用过程中,建议优先使用本地模型保障隐私,按需切换云端模型补充功能,同时注重显卡温度与显存占用监控,确保系统稳定运行。
1965 5
|
6天前
|
人工智能 自然语言处理 供应链
【最新】阿里云ClawHub Skill扫描:3万个AI Agent技能中的安全度量
阿里云扫描3万+AI Skill,发现AI检测引擎可识别80%+威胁,远高于传统引擎。
1402 3
|
6天前
|
人工智能 Linux API
离线AI部署终极手册:OpenClaw+Ollama本地模型匹配、全环境搭建与问题一站式解决
在本地私有化部署AI智能体,已成为隐私敏感、低成本、稳定运行的主流方案。OpenClaw作为轻量化可扩展Agent框架,搭配Ollama本地大模型运行工具,可实现完全离线、无API依赖、无流量费用的个人数字助理。但很多用户在实践中面临三大难题:**不知道自己硬件能跑什么模型、显存/内存频繁爆仓、Skills功能因模型不支持工具调用而失效**。
3228 7