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

相关文章
|
3月前
|
人工智能 JavaScript API
OpenClaw(龙虾AI)零门槛实操手册:最新阿里云+本地部署、千问API适配与避坑指南
2026年,OpenClaw(曾用名Clawdbot、Moltbot,因Logo酷似小龙虾被网友亲切称为“小龙虾”)已成为现象级开源AI智能体平台,GitHub星标数量突破18.6万。其“本地优先”的架构设计与插件化扩展能力,让普通用户无需专业技术背景,即可通过自然语言指令实现任务自动化、多工具协同、数据处理等复杂需求,真正构建“能听懂、会执行”的专属数字助理。
673 0
|
3月前
|
Linux API 网络安全
零基础落地OpenClaw:阿里云轻量服务器+本地MacOS/Linux/Windows11部署+千问大模型API配置详解
OpenClaw(原Clawdbot)作为2026年主流开源AI自动化执行框架,凭借**本地优先架构**、全渠道通信能力与持久记忆特性,成为个人开发者、内容创作者与中小企业搭建专属AI助理的核心工具。本文聚焦2026年4月最新部署场景,完整覆盖**阿里云轻量服务器云端部署**、**本地MacOS/Linux/Windows11多系统部署**两大路径,同时详细讲解**阿里云千问大模型API**与**市场免费Coding Plan API**的配置方法,针对部署、配置、运行全流程中的常见问题提供解决方案,全程附带可复制代码命令,零基础用户也能快速完成落地。
318 0
|
3月前
|
人工智能 运维 搜索推荐
AI语音客服落地之困:企业要的是“降本工具”,但用户要的是“解决问题”
AI语音客服落地难,主因非技术不足,而是企业误将其当作“降本工具”而非“体验升级系统”。认知偏差、运营缺失、成本误判、技术适配四大困境交织。破局关键在于转向“人机协同增强思维”,以客户体验为本,构建持续迭代的运营机制。
|
3月前
|
Web App开发 人工智能 API
AI英语口语APP的开发
2026年AI口语应用开发指南:聚焦低延迟(TTFA<500ms)、音素级发音纠错与拟人化对话。整合Whisper v3/Deepgram ASR、GPT-4o+端侧Llama 3.2、ElevenLabs TTS,支持中英混说、动态难度与AR角色扮演,兼顾效果与成本。(239字)
|
3月前
|
设计模式 Java Go
Go中的switch的8种使用场景:没有你想的那么简单
在 Go 中灵活使用 switch,可以使代码更清晰、更易维护。 switch 是 Go 中不可或缺的控制结构之一
924 0
|
3月前
|
监控 安全 数据处理
基于控制障碍函数(CBF)的多无人机编队避障路径规划研究附MATLAB代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。 🔥 内容介绍 一、多无人机编队应用需求与挑战 广泛的应用场景:多无人机编队在诸多领域展现出巨大潜力。在军事领域,可执行侦察、监视、攻击等任务,通过编队协同提高作战效能;在民用方面,诸如测绘、物流配送、大型活动安保等场景中,多无人机编队能够凭借集体优势,高效完成任务。例如,
|
3月前
|
安全 定位技术 数据中心
社交媒体账号安全如何通过IP查询工具检测异常登录?
IP在账号安全风控中通过提供“语境信息”,可有效识别异常登录。核心方法是将IP的地理位置、网络环境(家庭宽带 vs 数据中心)与用户行为基线对比,揪出三类风险:物理上不可能的地理跳跃、网络环境突变,以及同一IP的批量撞库行为。借助专业IP工具,平台能实时获取街道级精度定位、代理识别及多维度风险标签,从而精准触发二次验证或拦截。这种从“查地址”到“主动防御”的进化,能显著提升盗号拦截率。对个人而言,定期检查登录记录并开启双重验证,是防范密码泄露后的最后防线。
社交媒体账号安全如何通过IP查询工具检测异常登录?
|
3月前
|
数据可视化 Python
365Nimbus图像解析相机系统可见光图像L1,HDF5 V001
Nimbus图像解析相机系统(IDCS)L1级可见光图像数据集,源自Nimbus-3/4卫星,提供HDF5格式黑白影像,支持地理空间搜索与可视化分析。
73 2
|
10月前
|
JSON API 数据格式
小红书笔记详情API,json数据返回
以下是一个模拟的小红书笔记详情的JSON数据返回示例,包含了笔记的基本信息、作者信息、内容、图片、标签以及互动数据(点赞、评论、收藏)等关键字段: