波大大12138 发表于 2020-8-11 10:23:18

以数组作为函数的参数

代码如下:
void fun(int *a,int b[]) //没有数组长度?????????
{
    b=*a+6;
}
main()
{
    int a,b={0};
    a=0;
    b=3;
    fun(&a,b);
    printf("b=%d",b);
}
我的问题:以数组作为函数的参数格式:
类型标识符 函数名(类型标识符 数组名[],int n)
{
处理的代码
}
上述代码在定义函数格式时为什么没有数组长度,即定义格式与标准格式不一样是为什么

qiuyouzhi 发表于 2020-8-11 10:24:07

不需要定义数组长度呀,你只要让编译器理解需要传入一个数组类型的参数就够了

波大大12138 发表于 2020-8-11 10:27:39

qiuyouzhi 发表于 2020-8-11 10:24
不需要定义数组长度呀,你只要让编译器理解需要传入一个数组类型的参数就够了

我的问题是,为啥跟标准格式不一样

qiuyouzhi 发表于 2020-8-11 10:30:03

波大大12138 发表于 2020-8-11 10:27
我的问题是,为啥跟标准格式不一样

??这不就是标准格式吗
定义数组有两种方式,带长度的只能放那么多,
不带长度的可以自己计算(但必须在声明时定义)

Cool_Breeze 发表于 2020-8-11 11:00:02

本帖最后由 Cool_Breeze 于 2020-8-11 11:13 编辑

函数参数不管长度,只管类型
数组名就是这个数组的指针
void fun(int *a,int *b) //改成指针也一样

类型对的上就不会报错

二维数组只需要告诉函数第一维的长度
void fun(int (*b))
二维数组也可以做一维数组传入
#include <stdio.h>

void fun(int len, int *b) //没有数组长度?????????
{
    *(b+len*2+1)=6; 手动寻址
}
int main(void)
{
    int a,b={0};
    a=2;
    fun(a,*b);
    printf("b=%d",b); //6
}

baige 发表于 2020-8-11 11:17:09

传过去的是一个地址,你用指针接收,b[]就是一个指针,不需要长度

405794672 发表于 2020-8-11 13:07:25

不需要长度。你学到后面就会发现。你自己试也会发现。你随便写个长度,你看看,结果还是哪种长度的数组都能传入。数组传的是地址

xiaozhangxuexi 发表于 2020-8-11 15:02:34

本帖最后由 xiaozhangxuexi 于 2020-8-11 15:04 编辑

要理解这个,首先要是知道函数的形参和实参区别。看一遍定义就知道了。
楼主这边应认为实参和形参是一样的了。
main和fun函数里的 *a和b[]可不是一个东西。
你把主函数里的a改成b,c,d....,b改成a,b...都不影响结果的

风过无痕1989 发表于 2020-8-11 18:41:14

      1、C语言中,直到C99标准出现之前,声明数组时在方括号内只能使用整数常量表达式。而C99做了很大改进,允许数组的[ ]中的值是整形变量或是整形表达式。这就解释了下面的情况:

      int n;
      scanf ("%d", &n);
      int array;

      虽然n确实是需要运行时动态确定的变量,但是在C99中,以这种变量作为数组大小的形式已经是允许的了。这样的数组就被称之为“变长数组”。

      注意:变长数组是指用整型变量或表达式声明或定义的数组,而不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是固定的。

      2、数组用作函数参数有两种形式:一种是把数组元素(下标变量)作为实参使用;一种是把数组名作为函数的形参和实参使用。

         用数组名作为函数参数与用数组元素作实参有几点不同:

      1)用数组元素作函数参数不要求形参也必须是数组,但是用数组名作函数参数时,则要求形参和相对应的实参都是类型相同的数组。

      2)在 C 语言中,数组名除作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址,当数组名作函数参数时,实参与形参之间不是“值传递”,而是“地址传递”,实参数组名将该数组的其实地址传给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。

      3)在变量做函数参数时,所进行的值传递是单向的。即只能从实参传向形参,不能从形参传回实参。

乐乐学编程 发表于 2020-9-26 01:43:37

还没理解吗?帮你顶上去,让大家好帮你

小Saber 发表于 2020-9-28 14:04:48

因为形参不需要初始化赋值吧

小Saber 发表于 2020-9-28 14:08:51

函数里面定义的参数相当于地址,不是数组了,编译器只会传递地址

乐乐学编程 发表于 2020-10-1 13:56:31

再帮你顶上去
页: [1]
查看完整版本: 以数组作为函数的参数