C语言学习05:函数与程序结构

张建 lol

函数的声明和定义

  1. 在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数

  2. 如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数的前面进行函数的声明

  3. 函数的声明:

    返回值类型 函数名(参数1,参数2,…)

注:如果只有函数的声明,没有函数的定义,那么链接时会出错

多个源文件

项目大,如果都放在一个.c文件源代码会非常多,因此需要创建新的.c文件存放不同的代码

1
2
3
4
5
6
7
8
9
10
11
main.c
int main(){
int c = sum(1,2);
return 0;
}

sum.c
int sum(int a,int b){
return a+b;
}

include

  1. 作用

includeC 语言 预处理 指令之一,后面跟一个文件名,会根据文件名去查找文件,并把这个文件的内容包含到当前文件中。

  1. include<> 和 include“”区别
  • “”:从父文件夹搜索,找不到去父的父文件夹搜索,找不到去编译器设置的inlcude路径内搜索,找不到则在系统的INCLUDE环境变量内搜索
  • <>:编译器设置的include路径内搜索,找不到则在系统的INCLUDE环境变量内搜索

头文件.h 和 源文件 .c的分工

  1. 函数的声明写在 .h 文件中
  2. 函数的定义卸载 .c 源文件中

函数的参数

  1. 形式参数

形参 在定义时编译系统不分配内存,只有在调用函数时才分配内存。调用结束内存被释放。

  1. 实际参数

实参 出现在主函数中,当函数调用时,函数把实参的值传递给函数的形参,从而实现函数间的传递。

传递的方式有两种:值传递地址传递

局部变量和全局变量

  • 局部变量:首先是一个变量,其次是这个变量在程序的 局部范围有效

书写:首字母小写

  • 全局变量:首先是变量,其次在 定义处以下才有效

书写:首字母大写

头文件

  • include作用:

include:把头文件里的内容原封不动的复制到引用该头文件的地方

  • 头文件的格式说明
1
2
3
4
5
6
#ifndef 头文件名  // 头文件名的格式是"_头文件名_",注意要大写
#define 头文件名

头文件内容

#endif

示例代码:头文件main.h

1
2
3
4
5
6
7
8
9
10
#ifndef _MATH_H_    // 如果没有定义main.h,则执行下面的代码。这是防止重复定义
#define _MATH_H_ // 定义头文件

// 下面的代码是头文件内容
#include<stido.h> // 头文件
#define ADD 1 // 宏定义
extern int x; // 全局变量
void swap(int a,int b); // 函数声明

#endif // 表示头文件结束

内部函数和外部函数

  • 外部函数:可以被其他源文件调用的函数

在函数声明处添加 extern关键字,可省略

  • 内部函数:只在定义的源文件中有效

在函数的返回值类型前面添加 static关键字,也称 静态函数

练习

  1. 形参和实参

输入两个正整数m和n,求从m加到n的和(m<=n),并输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>

int sum(int a,int b);
void swap(int *a,int *b);

int main(int argc, const char * argv[]) {

int m,n,total;
printf("请输入两个整数:");
scanf("%d,%d",&m,&n);

if (m>n){
swap(&m, &n);
}
total = sum(m, n);
printf("a=%d,b=%d\n",m,n);
printf("total=%d\n",total);

return 0;
}

int sum(int a,int b){
for (int i = a+1; i <= b; i++) {
a += i;
}
return a;
}
void swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}

  • 定义选择排序和使用选择排序分别在不同的文件中

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

#define ARR_LEN 10

void select_sort(int arr[],int len);
void print_arr(int arr[],int len);

int main(int argc, const char * argv[]) {

int arr[ARR_LEN] = {8,1,4,10,3,6,2,7,9,5};
printf("排序前:\n");
print_arr(arr, ARR_LEN);

select_sort(arr, ARR_LEN);
printf("排序后:\n");
print_arr(arr, ARR_LEN);

return 0;
}

ssort.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

// 交换
static void swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}

// 打印数组
extern void print_arr(int arr[],int len){
for (int i = 0; i < len; i++) {
printf("%d",arr[i]);
}
printf("\n");
}

// 选择排序
extern void select_sort(int arr[],int len){
int i,j;
for (i = 0; i < len; i ++) {
for (j = i+1; j < len; j++) {
if (arr[i] > arr[j]){
swap(&arr[i], &arr[j]);
}
}
}
}
  • Post title:C语言学习05:函数与程序结构
  • Post author:张建
  • Create time:2023-02-13 20:36:40
  • Post link:https://redefine.ohevan.com/2023/02/13/C学习/C语言学习05:函数与程序结构/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.