C语言函数解析

一、什么是函数?

函数是C语言中用于封装特定功能的基本单元。你可以把它想象成一个“黑盒子”:你不需要知道内部是如何实现的,只需要提供输入(参数),它就会返回输出(结果)。这种封装性使得代码更模块化、更易维护和复用。

函数的基本结构:

返回类型 函数名(参数列表) {
    // 函数体
    return 返回值;
}
  • 返回类型:函数执行后返回的数据类型,如 intvoid 等。
  • 函数名:命名应见名知意,遵循命名规范。
  • 参数列表:函数接收的输入,可以是零个或多个。
  • 函数体:实现功能的具体代码。

二、函数的四种常见形式

1. 有返回值,有参数

int max(int a, int b) {
    return a > b ? a : b;
}

2. 无返回值,有参数

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

3. 有返回值,无参数

char* allocateMemory() {
    char *p = (char*)malloc(100);
    memset(p, 0, 100);
    return p;
}

4. 无返回值,无参数

void printMessage() {
    printf("Hello, World!\n");
}

三、形参与实参

  • 形参:函数定义中的参数,如 int max(int a, int b) 中的 ab
  • 实参:函数调用时传入的值,如 max(10, 20) 中的 1020

注意

  • 形参与实参的类型和数量必须一致。
  • 形参是函数的局部变量,与实参内存独立。

四、局部变量与栈内存

  • 局部变量:定义在函数内部或代码块 {} 中的变量。
  • 特点
    • 生命周期仅限于函数或代码块执行期间。
    • 函数结束后,局部变量所占内存被系统回收。
    • 形参也属于局部变量。

⚠️ 注意:不要返回局部变量的地址,否则会出现“悬挂指针”问题。

// 错误示例:
char* faultyFunc() {
    char str[] = "Hello";
    return str; // 返回局部数组地址,危险!
}

五、特殊函数类型

1. 递归函数

函数调用自身称为递归。必须有一个明确的终止条件,否则会导致栈溢出。

int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

2. 静态函数

使用 static 关键字修饰的函数,只能在定义它的文件中使用,避免命名冲突。

static void internalFunction() {
    printf("This is a static function.\n");
}

3. 回调函数

将函数作为参数传递,在特定时机由其他函数调用。

void callback(int a, int b, int (*op)(int, int)) {
    printf("Result: %d\n", op(a, b));
}

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

// 调用:
callback(10, 20, add); // 输出:30

六、常用字符串处理函数

函数名功能说明
strlen求字符串长度不包括结束符 \0
strcpy字符串复制不安全,可能越界
strncpy安全字符串复制可指定最大复制长度
strcmp字符串比较按ASCII码逐字符比较
strncmp安全字符串比较可指定比较长度
strcat字符串拼接不安全,可能越界
strncat安全字符串拼接可指定最大拼接长度
strchr查找字符首次出现返回指针或NULL
strrchr查找字符最后一次出现返回指针或NULL
strstr查找子字符串返回指针或NULL
strtok分割字符串会修改原字符串,线程不安全

七、总结

  • 函数是C语言模块化的基础,提高代码复用性和可读性。
  • 理解形参与实参的区别,避免误用。
  • 局部变量生命周期短,不要返回其地址。
  • 递归需谨慎,必须有终止条件。
  • 静态函数和回调函数是高级编程中常用的技巧。
  • 字符串函数使用时要特别注意内存安全和越界问题。

希望这篇博客能帮助你更好地理解和运用C语言中的函数。如有疑问,欢迎留言讨论!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值