【C语言】函数初步

目录

1.函数的基本概念

1.1.函数的定义与声明

1.2.函数的组成部分

1.3.函数的调用与返回值

2.函数的分类

2.1 库函数与用户自定义函数

2.2 无参函数与有参函数

2.3 有返回值函数与无返回值函数

3.函数的参数传递

3.1 值传递与地址传递

3.2 指针作为函数参数

3.3 数组作为函数参数

参数传递对比表

示例代码


1.函数的基本概念

1.1.函数的定义与声明

函数是编程中的基本构建块,用于封装可重用的代码。函数的定义包括指定函数的名称、参数列表、返回类型以及函数体。函数的声明通常出现在代码的顶部,用于告诉编译器函数的存在及其签名。

// 函数声明
int add(int a, int b);

// 函数定义
int add(int a, int b) {
    return a + b;
}
 

1.2.函数的组成部分

函数的组成部分包括返回类型、函数名、参数列表和函数体。

  • 返回类型:指定函数返回的数据类型。如果函数不返回任何值,则返回类型为 void
  • 函数名:函数的标识符,用于调用函数。
  • 参数列表:函数接受的输入参数,每个参数包括类型和名称。
  • 函数体:包含函数执行的代码块。
// 返回类型:int
// 函数名:multiply
// 参数列表:int a, int b
// 函数体:{ return a * b; }
int multiply(int a, int b) {
    return a * b;
}

1.3.函数的调用与返回值

函数通过函数名和参数列表进行调用。调用函数时,程序会执行函数体中的代码,并返回指定的值。

#include <stdio.h>

// 函数声明
int add(int a, int b);

int main() {
    int result = add(3, 4);  // 函数调用
    printf("Result: %d\n", result);  // 输出返回值
    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;  // 返回值
}

在上述示例中,add 函数被调用,并返回两个整数的和。返回值被存储在 result 变量中,并通过 printf 函数输出。

2.函数的分类

2.1 库函数与用户自定义函数

定义与示例:

// 库函数示例(数学函数)
#include <math.h>
double y = sqrt(9.0);  // 调用sqrt()库函数

// 用户自定义函数
int custom_max(int a, int b) {
    return (a > b) ? a : b;
}

特点对比:

  • 库函数:预编译在标准库中(如stdio.h, math.h),直接调用
  • 用户自定义函数:开发者按需编写,解决特定问题
库函数的学习和查看⼯具很多,⽐如:
C/C++官⽅的链接: https://zh.cppreference.com/w/c/header

2.2 无参函数与有参函数

语法结构:

// 无参函数
void welcome() {
    printf("欢迎使用系统");
}

// 有参函数
float circle_area(float r) {
    return 3.14159 * r * r;
}
  • 值传递:单向传递(默认方式)
  • 地址传递:通过指针操作内存

2.3 有返回值函数与无返回值函数

返回值类型:

// 有返回值函数
int factorial(int n) {
    return (n <= 1) ? 1 : n * factorial(n-1);
}

// 无返回值函数
void show_menu() {
    printf("1.新建\n2.打开\n3.退出");
}
  • void类型函数不可包含return语句(空return除外)
  • 返回值类型必须与声明一致

3.函数的参数传递

3.1 值传递与地址传递

值传递将实参的副本传给形参,函数内修改不影响原始变量:

void square(int x) {
    x = x * x; // 修改不影响外部变量
}

地址传递通过传递内存地址实现数据修改:

void square_ptr(int *x) {
    *x = (*x) * (*x); // 解引用修改原始数据
}

3.2 指针作为函数参数

典型应用场景:交换两个变量的值

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

// 调用方式
int x=5, y=10;
swap(&x, &y);  // x=10, y=5

内存示意图:

调用前:
x(0x1000) -> 5
y(0x1004) -> 10

指针参数:
a -> 0x1000
b -> 0x1004

3.3 数组作为函数参数

数组参数本质是指针传递,以下两种声明等效:

void print_array(int arr[], int size);
void print_array(int *arr, int size);

示例:计算数组平均值

float average(int arr[], int n) {
    float sum = 0;
    for(int i=0; i<n; i++) {
        sum += arr[i];  // arr[i]等价于*(arr+i)
    }
    return sum/n;
}
参数传递对比表
类型传递内容内存开销可修改性
基本类型值传递值副本不可修改原值
指针参数地址值可修改目标内存
数组参数首地址可修改数组元素

注:当结构体较大时,建议使用指针传递避免拷贝开销

示例代码

#include <stdio.h>

// 函数声明
int add(int a, int b);

int main() {
    int result = add(3, 4);
    printf("Result: %d\n", result);
    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值