关于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个元素的数组作为参数,而不是一个数组元素,明白了吗?

关于c语言数组的一些疑惑?
array[10] =5;因此,对于使用数组array[10](这里,你要把array[10]理解成含有10个元素的数组array,而不能理解成第10号元素)做形参,只写array[]即可(只写一个空的中括号)。但是,数组做形参时,C语言支持中括号里面写入数字,如array[0]、array[1]或array[10]等,但它们都是一样的,作用...

C语言数组作为形参实参的一些疑惑?
1.数组里面带元素个数:void fun(int arr[常数], int n);这里的常数可以是任意正整数,实际上编译器是会忽略,因为这里只要告诉编译器我接收的是一个数组指针,至于它有多少个元素不关心,因为实参也只是传个地址过来。元素个数由参数二控制。至于为什么要这么约定可以看下面补充说明。2.void fun(int...

c语言数组问题
问一:c语言开辟数组,如果里面存的是整数,那么没有复制之前,数组中默认的值为零,还是乱码。答:C语言声明数组变量时,只分配相应的空间和地址,而不对里面存放的数据初始化。不管是int、float、还是char型等,即里面存的无论是整数、小数还是字符,再没有复赋值之前,数组中默认的值都是乱码,而不...

关于C语言中数组定义问题
(1)在堆栈段中分配内存,由于太大无法分配,所以错误。(2)在数据段中分配内存,数据段可以分配,无错误。(3)数组比(1)需要的内存少,在堆栈段大小范围内,可以分配,无错误 (4)同(3)

C语言有关数组的一些疑问,数组可以只有一个元素吗?
AD_num[0] = m1和AD_num = m1是有区别的,前一个是把首个元素赋值为m1,后面AD_num如果是数组名是不能这么赋值的,错误。如果是个指针可以,但是如果m1是个数值编译会有警告。*AD_num=m1是和第一个等价的。数组可以只有一个元素,这个是肯定的。

c语言 关于数组 我们需要注意什么
其中 int 为类型,即整型(还有字符型 char 和float 实型等)a 为数组名 [] 为下标符号,里面的数字常量为 数组的第几号成员元素。例如 a[0]为 数组a[10]的第一号成员元素。这里有点要注意的是,数组元素下标值是从0开始的,即你定义a[10],则他的成员数为a[0]到a[9].千万不要把a[...

C语言 数组指针的一些疑惑不解,下图红线中的第二个不是很理解
说是行地址的时候,表示对这个地址做加1,会移动一行,说是列地址的时候,会移动一列。二维数组a相当于二维常量指针,也就是说是指针的指针,所以说a是行地址,因为对a做加1操作的时候,会指向下一组指针。那么*a表示的相当于一维数组,*(a+1)也是,他们都在这个定义里都相当于一个int b[4],...

c语言关于数组的一个问题
纠正楼上一个说法,注意此处是个语义错误但并不是语法错误;实际编译中编译器可能会出warning但编译是可以通过的,因为c是个弱类型语言,指针和char都被视作数值类型,能够进行各类自动转换。关于题主的问题,注意此处加的是'3'而不是3,即ascii码的51。str偏移51实际造成数组越界。

c语言关于数组长度的疑问
a末尾有"\\0",b没有。题目出得不清楚,“数组长度”指数组有几个数组元素,还是占据内存的长度,还是字符串长度。数组元素个数,a 4个,b 3个 占据内存的长度,sizeof(a)得4 ,sizeof(b)得 3 字符串长度,strlen(a)得3 ,strlen(b)得 3 题目想问的是“字符串长度”,说成“数组长度”。

关于C语言二组字符数组问题?
在C语言中定义数组char name[1][20],那么它的内存大小就指定了1行20个字符大小。不能越界赋值或访问!你对错误的代码看到的结果不能说明任何问题。你想要的是动态数组。应该用malloc和realloc函数来实现动态数组,这里有几个注意点:1、你输入的是字符串长度不定且一个字符串可能会包含空格,所以不...

相似回答