C/C++复习--C语言中的函数详细


一、函数的基本概念

函数 是C语言中封装代码的基本单元,类似于数学中的函数。
作用

  1. 提高代码复用性
  2. 模块化编程,增强可维护性
  3. 隐藏实现细节

分类

  • 库函数 :由C标准库提供(如printf, strcpy
  • 自定义函数:程序员根据需求自行设计

二、库函数与自定义函数
1. 库函数示例:strcpymemset
c 复制代码
#include <stdio.h>
#include <string.h>

int main() {
    char dest[20];
    char src[] = "Hello, World!";
    strcpy(dest, src);  // 字符串拷贝
    printf("Copied string: %s\n", dest);

    int arr[5];
    memset(arr, 0, sizeof(arr));  // 内存初始化为0
    printf("First element: %d\n", arr[0]);
    return 0;
}
  • 关键点
    • 使用库函数需包含对应头文件(如#include <string.h>
    • strcpy(dest, src):将src内容复制到dest
    • memset(ptr, value, num):将ptr指向的内存的前num字节设置为value
2. 自定义函数示例:交换两个整数
c 复制代码
#include <stdio.h>

// 传值调用(无法交换)
void Swap1(int x, int y) {
    int tmp = x;
    x = y;
    y = tmp;
}

// 传址调用(正确版本)
void Swap2(int *px, int *py) {
    int tmp = *px;
    *px = *py;
    *py = tmp;
}

int main() {
    int a = 10, b = 20;
    Swap1(a, b);  // 无效
    printf("Swap1: a=%d, b=%d\n", a, b);

    Swap2(&a, &b);  // 有效
    printf("Swap2: a=%d, b=%d\n", a, b);
    return 0;
}
  • 关键点
    • 形参 是实参的临时拷贝,修改形参不影响实参(Swap1无效)。
    • 传址调用 通过指针直接操作内存,实现数据交换(Swap2有效)。

三、函数参数传递
1. 传值调用 vs. 传址调用
类型 特点 适用场景
传值调用 形参是实参的拷贝 不需要修改原始数据
传址调用 通过指针直接操作内存 需要修改原始数据
2. 示例:数组作为参数
c 复制代码
#include <stdio.h>

// 数组作为参数时,实际传递的是首元素地址
void PrintArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    PrintArray(arr, 5);  // 输出:1 2 3 4 5
    return 0;
}

四、递归函数
1. 递归示例:计算阶乘
c 复制代码
#include <stdio.h>

int Factorial(int n) {
    if (n <= 1) return 1;       // 递归终止条件
    else return n * Factorial(n - 1);  // 递归调用
}

int main() {
    int n = 5;
    printf("%d! = %d\n", n, Factorial(n));  // 输出:120
    return 0;
}
  • 关键点
    • 递归必须有终止条件,否则会导致栈溢出。
    • 递归深度较大时效率低下,可改用迭代优化。
2. 递归与迭代对比:斐波那契数列
c 复制代码
// 递归实现(效率低)
int Fib(int n) {
    if (n <= 2) return 1;
    return Fib(n - 1) + Fib(n - 2);
}

// 迭代实现(效率高)
int FibIter(int n) {
    int a = 1, b = 1, c = 1;
    while (n > 2) {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}

五、函数分文件编写
1. 头文件声明:math_utils.h
c 复制代码
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

// 函数声明
int Add(int x, int y);
double Power(double base, int exponent);

#endif
2. 源文件实现:math_utils.c
c 复制代码
#include "math_utils.h"

int Add(int x, int y) {
    return x + y;
}

double Power(double base, int exponent) {
    double result = 1.0;
    for (int i = 0; i < exponent; i++) {
        result *= base;
    }
    return result;
}

六、经典问题实战
1. 判断素数
c 复制代码
#include <stdio.h>
#include <math.h>

int IsPrime(int n) {
    if (n <= 1) return 0;
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}

int main() {
    int num = 17;
    printf("%d is %s\n", num, IsPrime(num) ? "prime" : "not prime");
    return 0;
}
2. 二分查找
c 复制代码
#include <stdio.h>

int BinarySearch(int arr[], int size, int target) {
    int left = 0, right = size - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] < target) left = mid + 1;
        else if (arr[mid] > target) right = mid - 1;
        else return mid;
    }
    return -1;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int target = 3;
    int index = BinarySearch(arr, 5, target);
    printf("Index: %d\n", index);  // 输出:2
    return 0;
}
相关推荐
AAA代码批发商8 分钟前
Days 39 Linux C 开发之 SQLite 数据库完整学习笔记
linux·c语言·数据库
汉克老师17 分钟前
CSP-J 初赛(以满分为目标):第二十六课 《图的遍历——DFS深度优先搜索——从“树的先序遍历”走进真正的图世界》
c++·csp-j·小学生·学c++编程
程序猿编码23 分钟前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
leihefeng29 分钟前
手写数字识别:KNN vs 逻辑回归实战
python·算法·机器学习·逻辑回归·scikit-learn
影视飓风TIM1 小时前
C++哈希表深度剖析:冲突处理、rehash、迭代器与unordered容器封装
c++·哈希算法·散列表
全栈技术负责人1 小时前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
mmmmath_31 小时前
面试题 02.07. 链表相交
算法·链表
C++ 老炮儿的技术栈1 小时前
Qt5 使用 QPainter 绘制阿基米德螺线
开发语言·c++·windows·qt·代码化
卢锡荣2 小时前
单芯掌控多口互联|乐得瑞 LDR6020 PD3.1 多通道 Type‑C 控制 SOC 芯片
c语言·开发语言
residual_fan2 小时前
特征级SMOTE(Feature-level SMOTE)论文分享
人工智能·算法·数据挖掘·数据分析