形参数组与多维数组:调用时首地址传递

需积分: 10 33 下载量 35 浏览量 更新于2024-08-23 收藏 6.96MB PPT 举报
"形参数组大小(多维数组第一维)可不指定-c程序设计谭浩强第四版" 在C语言程序设计中,形参数组的处理方式有些特殊,尤其是在涉及多维数组时。标题提到的“形参数组大小(多维数组第一维)可不指定”是指在定义函数参数时,可以不明确地给出多维数组的第一维的大小。这是因为C语言编译器在处理函数的形参时,并不会检查数组的实际大小,这与定义普通变量时必须指定大小的情况有所不同。 形参数组的定义通常会写成`type array[]`或者`type array[][]`等形式,这里的方括弧中的数字可以省略,表示该维度的大小在调用时由实际传入的数组决定。这样做是因为在函数调用时,传递给函数的只是数组的首地址,而不是整个数组的拷贝。因此,形参数组的尺寸信息在函数内部是不可见的,它只能通过函数外部传入的实参来确定。 例如,我们定义一个接受二维数组作为参数的函数: ```c void printArray(int arr[][3]) { // 函数内部无法知道arr的第一维大小,但知道第二维是3 } ``` 在这个例子中,虽然没有指定第一维的大小,但在函数内部,我们依然可以访问和操作数组的元素,因为数组名`arr`实际上是一个指向整型数组的指针,它存储的是数组的第一个元素的地址。数组的第二维大小3是已知的,因为它在定义时被指定。 调用这个函数时,你可以传入任意长度的第一维数组,只要第二维的大小是3: ```c int main() { int score[5][3]; // 定义了一个5行3列的数组 printArray(score); // 调用函数,传入score数组 return 0; } ``` 在这个例子中,`score[5][3]`和`printArray`中的`arr`实际上指向同一个内存区域,即数组`score`的首地址。由于形参数组的大小在函数内部未知,所以在函数内部不能动态改变数组的大小或进行越界操作,这可能导致未定义的行为。 函数间的数据传递是C语言编程的重要部分,特别是涉及到数组时。数组可以作为参数传递,但是传递的是数组的副本(实际上是一个指针)。因此,函数内对数组的修改会影响到实际传入的数组。递归调用是函数的一个高级特性,它是指函数在其定义中调用自身。对于递归函数来说,理解调用栈的工作原理以及如何正确地设置递归基是非常关键的。 外部函数和外部变量是C语言中用于在不同源文件之间共享数据和功能的机制。外部变量(extern关键字声明)可以在文件外部被其他文件访问,而外部函数则可以在任何地方被调用。理解和熟练使用这些概念是编写大型、模块化C程序的基础。 C语言程序设计涉及到许多核心概念,包括但不限于数组、函数、递归、数据传递和变量的作用域。理解这些概念对于编写高效、可靠的C代码至关重要。在谭浩强的《C程序设计第四版》中,这些主题都会得到深入的讨论和实践。