C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World C - 编译过程 C - 注释 C - 标记 C - 关键字 C - 标识符 C - 用户输入 C - 基本语法 C - 数据类型 C - 变量 C - 整数提升 C - 类型转换 C - 类型转换 C - 布尔值

C 语言中的常量和文字

C - 常量 C - 字面量 C - 转义序列 C - 格式说明符

C 语言中的运算符

C - 运算符 C - 算术运算符 C - 关系运算符 C - 逻辑运算符 C - 位运算符 C - 赋值运算符 C - 一元运算符 C - 递增和递减运算符 C - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 C - 递归

C 语言中的作用域规则

C - 作用域规则 C - 静态变量 C - 全局变量

C 语言中的数组

C - 数组 C - 数组的属性 C - 多维数组 C - 将数组传递给函数 C - 从函数返回数组 C - 可变长度数组

C 语言中的指针

C - 指针 C - 指针和数组 C - 指针的应用 C - 指针运算 C - 指针数组 C - 指向指针的指针 C - 将指针传递给函数 C - 从函数返回指针 C - 函数指针 C - 指向数组的指针 C - 指向结构体的指针 C - 指针链 C - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


在 C 语言中将数组作为函数参数传递

如果要将数组传递给函数,可以使用按值调用按引用调用方法。在按值调用方法中,函数的参数应该是一个已初始化的数组,或者是一个大小与要传递的数组大小相等的固定数组。在引用调用方法中,函数参数是指向数组的指针。

通过值调用方法传递数组

在以下代码中,main() 函数包含一个整数数组 数组。用户定义函数 average() 通过将数组传递给该函数进行调用。average() 函数接收该数组,并使用 for 循环 将其元素相加。它返回一个浮点值,表示数组中数字的平均值。

示例

#include <stdio.h>
float average(int arr[5]);
int main(){
   int arr[] = {10, 34, 21, 78, 5};
   float avg = average(arr);
   printf("average: %f", avg);
}
float average(int arr[5]){
   int sum=0;
   int i;
   for (i=0; i<5; i++){
      printf("arr[%d]: %d
", i, arr[i]);
      sum+=arr[i];
   }
   return (float)sum/5;
}

输出

arr[0]: 10
arr[1]: 34
arr[2]: 21
arr[3]: 78
arr[4]: 5
average: 29.600000

在以下变体中,average() 函数定义有两个参数,一个未初始化且未指定大小的数组。main() 函数中声明的数组长度是通过将数组大小除以 int 数据类型的大小得出的。

示例

#include <stdio.h>
float average(int arr[], int length);
int main(){
   int arr[] = {10, 34, 21, 78, 5};
   int length = sizeof(arr)/sizeof(int);
   float avg = average(arr, length);
   printf("average: %f", avg);
}
float average(int arr[], int length){
   int sum=0;
   int i;
   for (i=0; i<length; i++){
      printf("arr[%d]: %d
", i, arr[i]);
      sum+=arr[i];
   }
   return (float)sum/length;
}

输出

arr[0]: 10
arr[1]: 34
arr[2]: 21
arr[3]: 78
arr[4]: 5
average: 29.600000

通过引用调用传递数组

要使用此方法,我们应该理解数组中的元素属于相似的数据类型,存储在连续的内存位置,并且数组大小取决于数据类型。此外,第 0 个元素的地址是指向数组的指针

在以下示例中 -

int a[5] = {1,2,3,4,5};

数组的大小为 20 字节(每个 int 占 4 字节)

int *x = a;

这里 x 是指向数组的指针。它指向第 0 个元素。如果指针加 1,则指向下一个元素。

示例

#include <stdio.h>
int main() {
   int a[] = {1,2,3,4,5};
   int *x = a, i;
   for (i=0; i<5; i++){
      printf("%d
", *x);
      x++;
   }
   return 0;
}

输出

1
2
3
4
5

让我们利用此特性通过引用传递数组。在 main() 函数中,我们声明一个数组并将其地址传递给 max() 函数。max() 函数使用指针遍历该数组,并将数组中的最大数字返回给 main() 函数。

示例

#include <stdio.h>
int max(int *arr, int length);
int main(){
   int arr[] = {10, 34, 21, 78, 5};
   int length = sizeof(arr)/sizeof(int);
   int maxnum = max(arr, length);
   printf("max: %d", maxnum);
}
int max(int *arr, int length){
   int max=*arr;
   int i;
   for (i=0; i<length; i++){   
      printf("arr[%d]: %d
", i, (*arr));
      if ((*arr)>max)
         max = (*arr);
      arr++;
   }
   return max;
}

输出

arr[0]: 10
arr[1]: 34
arr[2]: 21
arr[3]: 78
arr[4]: 5
max: 78

max() 函数从 main() 函数中获取数组的地址,并将其存储在指针 arr 中。每次递增时,它都会指向原始数组中的下一个元素。

max() 函数也可以像普通下标数​​组一样访问数组元素,定义如下:

int max(int *arr, int length){
   int max=*arr;
   int i;
   for (i=0; i<length; i++){   
      printf("arr[%d]: %d
", i, arr[i]);
      if (arr[i]>max)
         max = arr[i];
   }
   return max;
}

将二维数组传递给函数

您也可以将二维数组的指针传递给函数。在函数内部,使用嵌套 for 循环结构遍历二维数组。

示例

#include <stdio.h>
int twoDarr(int *arr);
int main(){
   int arr[][3]= {10, 34, 21, 78, 5, 25};
   twoDarr(*arr);
}
int twoDarr(int *arr){
   int max=*arr;
   int i, j;
   for (i=0; i<2; i++){
      for (j=0; j<3; j++){
         printf("%d	", arr[i]);
         arr++;
      }
      printf("
");
   }
}

输出

10      34      21
5       25      16

比较字符串长度的函数

在下面的程序中,两个字符串被传递给 compare() 函数。在 C 语言中,字符串是一个 char 数据类型的数组。我们使用 strlen() 函数 来计算字符串的长度,即字符串中字符的数量。

示例

#include <stdio.h>
#include <string.h>
int compare( char *, char *);
int main() {
   char  a[] = "BAT";
   char  b[] = "BALL";
   int ret = compare(a, b);
   return 0;
}
int compare (char *x, char *y){
   int val;
   if (strlen(x)>strlen(y)){
      printf("length of string a is greater than or equal to length of string b");
   }
   else{
      printf("length of string a is less than length of string b");
   }
}

输出

length of string a is less than length of string b