鱼C论坛

 找回密码
 立即注册
查看: 1318|回复: 12

[已解决]以数组作为函数的参数

[复制链接]
发表于 2020-8-11 10:23:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:
void fun(int *a,int b[]) //没有数组长度?????????
{
    b[0]=*a+6;
}
main()
{
    int a,b[5]={0};
    a=0;
    b[0]=3;
    fun(&a,b);
    printf("b[0]=%d",b[0]);
}
我的问题:以数组作为函数的参数格式:
类型标识符 函数名(类型标识符 数组名[],int n)
{
处理的代码
}
上述代码在定义函数格式时为什么没有数组长度,即定义格式与标准格式不一样是为什么
最佳答案
2020-8-11 10:30:03
波大大12138 发表于 2020-8-11 10:27
我的问题是,为啥跟标准格式不一样

??这不就是标准格式吗
定义数组有两种方式,带长度的只能放那么多,
不带长度的可以自己计算(但必须在声明时定义)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-11 10:24:07 | 显示全部楼层
不需要定义数组长度呀,你只要让编译器理解需要传入一个数组类型的参数就够了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我的问题是,为啥跟标准格式不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 10:30:03 | 显示全部楼层    本楼为最佳答案   
波大大12138 发表于 2020-8-11 10:27
我的问题是,为啥跟标准格式不一样

??这不就是标准格式吗
定义数组有两种方式,带长度的只能放那么多,
不带长度的可以自己计算(但必须在声明时定义)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 11:00:02 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-8-11 11:13 编辑

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

类型对的上就不会报错

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

void fun(int len, int *b) //没有数组长度?????????
{
    *(b+len*2+1)=6; 手动寻址
}
int main(void)
{
    int a,b[5][2]={0};
    a=2;
    fun(a,*b);
    printf("b[0]=%d",b[2][1]); //6
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 11:17:09 From FishC Mobile | 显示全部楼层
传过去的是一个地址,你用指针接收,b[]就是一个指针,不需要长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 13:07:25 | 显示全部楼层
不需要长度。你学到后面就会发现。你自己试也会发现。你随便写个长度,你看看,结果还是哪种长度的数组都能传入。数组传的是地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 15:02:34 | 显示全部楼层
本帖最后由 xiaozhangxuexi 于 2020-8-11 15:04 编辑

要理解这个,首先要是知道函数的形参和实参区别。看一遍定义就知道了。
楼主这边应认为实参和形参是一样的了。
main和fun函数里的 *a和b[]可不是一个东西。
你把主函数里的a改成b,c,d....,b[5]改成a[5],b[10]...都不影响结果的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 18:41:14 | 显示全部楼层
      1、C语言中,直到C99标准出现之前,声明数组时在方括号内只能使用整数常量表达式。而C99做了很大改进,允许数组的[ ]中的值是整形变量或是整形表达式。这就解释了下面的情况:

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

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

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

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

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

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

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

        3)在变量做函数参数时,所进行的值传递是单向的。即只能从实参传向形参,不能从形参传回实参。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-26 01:43:37 | 显示全部楼层
还没理解吗?帮你顶上去,让大家好帮你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 14:04:48 | 显示全部楼层
因为形参不需要初始化赋值吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 14:08:51 | 显示全部楼层
函数里面定义的参数相当于地址,不是数组了,编译器只会传递地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-1 13:56:31 | 显示全部楼层
再帮你顶上去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表