关于c语言数组的一些疑惑?

书上说那个数组不能作为形参使用。可是书后面的例子,他又自定义了一个函数,定义了一个数组作为形参。就不太懂。

数组元素不能做形参,这个论述是正确的。
我们都知道,单个元素可以做形参,数组也可以做形参。但是,二者有本质上的区别。
单个元素做形参,是建立一个变量副本,程序运行时,实参把值传给副本,就没有实参的什么事了,后面对副本的赋值、改写,都不会影响实参。
而数组做形参时,只是把实参的首地址传给形参,后面对形参的元素的赋值和改写,直接对实参的数组元素进行了赋值和改写。
在C语言中,array[10]有两种含义:
①它指含有10个元素的数组array,如:
int array[10];
②它指数组array的第10号元素,如:
array[10] =5;
因此,对于使用数组array[10](这里,你要把array[10]理解成含有10个元素的数组array,而不能理解成第10号元素)做形参,只写array[]即可(只写一个空的中括号)。
但是,数组做形参时,C语言支持中括号里面写入数字,如array[0]、array[1]或array[10]等,但它们都是一样的,作用与写成array[]完全相同。
就是说,数组做形参时,你可以无视中括号内的数字(程序运行时,也不管中括号内的数字)。
所以,定义函数语句:
float average( float array[10])
与写成:
float average(float array[])
完全相同。
补充一点,数组形参的中括号内写上一个10,也有一个好处,它提醒编程人员这里需要一个含有10个元素的数组!但千万不要理解成数组的第10号元素做形参。
OK?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-08-03
左边书上说的是数组的元素不能作为形参,不能理解为数组不能作为形参。
实际上这书它说的太绕了,不易理解。
只要记住数组作为函数参数可以由下面几种方式:
1. type fun(type arr[], int size);
2.type fun(type *arr, int size);
3.type fun(type arr[常数], int size);
其中1/2种方式是最常用的,第三种不常用,一般不会写常数因为写了编译器也不关心。另外一个问题也是你问的吧具体可以看看那个说明。
第2个回答  2021-08-03

在用数组名作函数参数时,不是进行值的传送,不会把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢?数组名就是数组的首地址,用数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实实在在的数组。实际上是形参数组和实参数组为同一数组,拥有同一段内存空间。这种传值方式成为按引用传递。

注意:形参中给出数组长度是没有意义的,编译器并不为它分配内存,将上面 aver 函数的形参改为 float a[1]、float a[100] 依然是正确的。所以一般用指针变量来代替,可以改为float *a。

第3个回答  2021-08-03
数组元素不能作为形参, 但是数组能啊, 例子中形参是一个数组
第4个回答  2021-08-04
书上说的没错,你可能把array[10]理解成一个数组元素了吧,其实它只是把一个包含有10个元素的数组作为参数,而不是一个数组元素,明白了吗?