以数组作为函数的参数
代码如下: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
不需要定义数组长度呀,你只要让编译器理解需要传入一个数组类型的参数就够了
我的问题是,为啥跟标准格式不一样 波大大12138 发表于 2020-8-11 10:27
我的问题是,为啥跟标准格式不一样
??这不就是标准格式吗
定义数组有两种方式,带长度的只能放那么多,
不带长度的可以自己计算(但必须在声明时定义) 本帖最后由 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
} 传过去的是一个地址,你用指针接收,b[]就是一个指针,不需要长度 不需要长度。你学到后面就会发现。你自己试也会发现。你随便写个长度,你看看,结果还是哪种长度的数组都能传入。数组传的是地址 本帖最后由 xiaozhangxuexi 于 2020-8-11 15:04 编辑
要理解这个,首先要是知道函数的形参和实参区别。看一遍定义就知道了。
楼主这边应认为实参和形参是一样的了。
main和fun函数里的 *a和b[]可不是一个东西。
你把主函数里的a改成b,c,d....,b改成a,b...都不影响结果的
1、C语言中,直到C99标准出现之前,声明数组时在方括号内只能使用整数常量表达式。而C99做了很大改进,允许数组的[ ]中的值是整形变量或是整形表达式。这就解释了下面的情况:
int n;
scanf ("%d", &n);
int array;
虽然n确实是需要运行时动态确定的变量,但是在C99中,以这种变量作为数组大小的形式已经是允许的了。这样的数组就被称之为“变长数组”。
注意:变长数组是指用整型变量或表达式声明或定义的数组,而不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是固定的。
2、数组用作函数参数有两种形式:一种是把数组元素(下标变量)作为实参使用;一种是把数组名作为函数的形参和实参使用。
用数组名作为函数参数与用数组元素作实参有几点不同:
1)用数组元素作函数参数不要求形参也必须是数组,但是用数组名作函数参数时,则要求形参和相对应的实参都是类型相同的数组。
2)在 C 语言中,数组名除作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址,当数组名作函数参数时,实参与形参之间不是“值传递”,而是“地址传递”,实参数组名将该数组的其实地址传给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。
3)在变量做函数参数时,所进行的值传递是单向的。即只能从实参传向形参,不能从形参传回实参。 还没理解吗?帮你顶上去,让大家好帮你 因为形参不需要初始化赋值吧 函数里面定义的参数相当于地址,不是数组了,编译器只会传递地址 再帮你顶上去
页:
[1]