c语言函数数组为形参 c语言数组做函数形参

C语言中函数定义形参为数组时的问题1.数组为参数传递的是数组首地址,而不是元素的值,而你说的a[size]仅仅是值,况且事实上也没有a[size]这个元素
2.既然是数组名的传递,当然需要由一个数组的参数来接收,int v[]”的问题是因为他是形式参数,是为了接收数组的
n的问题是因为,如果只传递了数组,但是函数并找不到数组的个数,所以需要把数组大小传递过来
C语言中用数组做为形参为什么形参改变时实参也要变??c语言中数组名作为实参传给被调用的函数时,形参获得的是数组的起始地址 。
还是用例子说话吧 。
#include
int
*arry(int
*a)
{
int
*b;
b
=
a;
int
i;
for(i=0;i5;i)
{
printf("%d",a[i]);
}
return
b;
}
【c语言函数数组为形参 c语言数组做函数形参】int
main()
{
int
a[5]
=
{1,2,3,4,5};
int
*c;
int
i;
c
=
arry(a);
for(i=0;i5;i)
{
printf("%d",c[i]);
}
}
主要是通过指针把数组,例如main里面的a的地址传入arry函数,然后在arry函数中用一个兼容类型的指针接收地址,然后就可以再这个指针下的地址操作地址上面的数据了 。
arry返回的时候也是返回一个指针(地址) 。
如何在C语言中以数组指针作为形参输出数组数组 与 普通指针 的区别:
1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量 。
2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变 。指针可以随时指向任意类型的内存块,它的特征是"可变",所以我们常用指针来操作动态内存 。
3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针 。
因为第三条,当把数组名作为函数的形参进行传递时,该效果等同于传递一个同类型的指针 。直接在程序当中调用 函数名(数组名)即可 。
例程:
#includestdio.h
int a[]={1,2,3,4,5,6};
void print(int a[]){//数组指针作为形参
for(i=0;i6;i) printf("%d ",a[i]);//输出数组
}
int main(){
print(a);//传入数组名
return 0;
}
C语言数组作为形参实参的一些疑惑?void fun(int arr[], int n);
在函数定义的时候c语言函数数组为形参,形参int arr[]不是表示某个元素的值,而是告诉编译器第一个参数是一个数组指针,可以接收实参传过来的数组地址 。
实际上以上定义等价于下面的定义 。
1.数组里面带元素个数:
void fun(int arr[常数], int n);
这里的常数可以是任意正整数,实际上编译器是会忽略,因为这里只要告诉编译器c语言函数数组为形参我接收的是一个数组指针,至于它有多少个元素不关心,因为实参也只是传个地址过来 。元素个数由参数二控制 。至于为什么要这么约定可以看下面补充说明 。
2.void fun(int *arr, int n);
使用指针 , 这种方式和题目中的方式是最常用的方式,第一种最不常用 。
补充说明(为什么数组作为函数参数是传地址,而不是传每个元素):
设想一下,有一个函数如下
int fun(int nums[1000], int size)
它的参数一要处理1000多个元素的数组,如果是传值即每个元素 , 那在函数体内是不是就得再申请1000多个整数的内存,还需要把值从实参那里复制过来 , 这是非常耗时间的而且没有必要,因为在内存的某个块已经存放c语言函数数组为形参了这些数据 。只要告诉放在哪个位置,c语言函数数组为形参你函数体去那里找就行了 。这里说的就是传地址了 , 只需要传个数组首地址,然后告诉有多少个元素要处理就OK了 。传地址只需要复制地址给形参,相对传每个元素快得多 。
关于c语言函数数组为形参和c语言数组做函数形参的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读