1. 二维数组的定义和引用
- 二维数组的定义:二维数组定义的一般形式为
类型说明符 数组名[常量表达式1][常量表达式2]
,例如float a[3][4], b[5][10]
,表示定义了3行4列的数组a
和5行10列的数组b
。可以把二维数组看作是特殊的一维数组,其元素又是一个一维数组。 - 二维数组的引用:二维数组元素的表示形式为
数组名[下标][下标]
,下标可以是整型常量或整型表达式。需要注意的是,在使用下标时不能超出数组定义的范围。 - 二维数组的初始化:可以分行给二维数组赋初值,如
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}
;也可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值;还可以对部分元素赋初值,未被赋值的元素自动初始化为0。此外,如果对全部元素都赋初值,且第一维的长度可以省略,但第二维的长度不能省。 - 二维数组程序举例:通过例7.4展示了如何将一个二维数组行和列的元素互换并存储到另一个二维数组中;例7.5展示了如何找出一个3×4的矩阵中值最大的元素及其所在的行号和列号。
2.函数
1.概述
- 函数的作用:一个C程序可由一个主函数和若干个其他函数构成,由主函数调用其他函数,其他函数也可以互相调用,函数的作用是将一个大的程序分解为若干个小的模块,便于分别编写、分别编译,提高调试效率。
- 函数的分类:从用户使用的角度看,函数分为标准函数(库函数)和用户自己定义的函数;从函数的形式看,函数分为无参函数和有参函数。
- 函数调用的相关说明:一个源程序文件是一个编译单位,C程序的执行是从
main
函数开始的,所有函数都是平行的,不能嵌套定义,但可以嵌套调用。
2.函数定义的一般形式
- 无参函数定义的一般形式:
类型标识符 函数名() { 声明部分; 语句部分; }
,例如例8.1中的printstar
和print_message
函数都是无参函数。 - 有参函数定义的一般形式:
类型标识符 函数名(形式参数表列) { 声明部分; 语句部分; }
,例如int max(int x, int y) { int z; z = x > y? x : y; return(z); }
,其中x
和y
是形式参数,用于接收主调函数传递过来的值。 - 空函数:空函数的形式为
类型说明符 函数名() {}
,调用此函数时不执行任何操作,通常用于在程序设计中为将来扩充功能预留位置。
3.函数参数和函数的值
- 形式参数和实际参数:在调用函数时,主调函数和被调用函数之间通过参数进行数据传递。实参可以是常量、变量或表达式,在调用时将实参的值传递给形参。实参与形参的类型应相同或赋值兼容,且在C语言中,实参向形参的数据传递是“值传递”,单向传递,即实参的值传递给形参后,形参的值的改变不会影响实参的值。
- 函数的返回值:函数的返回值是通过函数中的
return
语句获得的,函数值的类型应与函数定义时指定的类型一致,否则以函数类型为准进行自动类型转换。对于不带回值的函数,应定义为“无类型”(void
)。
4.函数的调用
- 函数调用的一般形式:函数调用的一般形式为
函数名(实参表列)
,如果是调用无参函数,则“实参表列”可以没有,但括号不能省略。实参与形参的个数应相等,类型应匹配,实参求值的顺序在不同的编译系统中可能不同。 - 函数调用的方式:函数调用有函数语句、函数表达式和函数参数三种方式。函数语句是将函数调用作为一个语句,不要求函数带回值;函数表达式是将函数出现在一个表达式中,要求函数带回一个确定的值以参加表达式的运算;函数参数是将函数调用作为一个函数的实参。
- 对被调用函数的声明和函数原型:在一个函数中调用另一个函数需要具备一些条件,包括被调用的函数必须是已经存在的函数,使用库函数时需要在文件开头用
#include
命令包含相关信息,使用用户自己定义的函数且函数位置在调用它的函数之后时,需要在主调函数中对被调用的函数作声明。函数原型是函数声明的一种形式,它能使编译系统对函数调用的合法性进行全面检查,减少编写程序时可能出现的错误。