c语言中数组名作为函数参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中数组名作为函数参数相关的知识,希望对你有一定的参考价值。
float average(float a[10])
int arrLen = sizeof(a) / 4;
float sumSco = 0;
for (int i = 0; i < arrLen; i++)
sumSco += a[i];
return sumSco / arrLen;
返回的值始终为1,无论实参的数组长度为多少,arrLen始终为1
arrLen作为局部变量每次调用时不是都会从新分配内存空间吗?为什么无论传入的参数是多少均为形参a[]的长度?
应该这样:
float average(float a[10],int arrLen)
float sumSco = 0;
for (int i = 0; i < arrLen; i++)
sumSco += a[i];
return sumSco / arrLen;
追问
在函数定义时*a指向的是随机分配的地址,在函数调用时应该指向的是此时*a指向的地址应该是作为实参的地址。那么每次函数调用都应该是对实参进行操作,所以为什么每次调用都是定义时的初始地址?
追答1.
float average(float a[10])实际上相当于 float average(float *a),编译器就是这样处理的。
2.
对于任何指针类型,如:int *p;char *q;float *a;计算sizeof(p); sizeof(q); sizeof(a);的值都是4, float average(float *a)中的a也不例外。
3.
假设有 float *a; 计算 sizeof(a);的大小时,不受a指向的数组的大小的影响,a是否指向了任何对象还是没有也不影响 sizeof(a);的计算。比如假设有: float *a,arr1[2],arr2[3]=1,2,3;
则此时 sizeof(a);的值是4,a=arr1;后 sizeof(a);的值还是4,虽然此时a指向的数组arr1的大小是8(即 sizeof(arr1); 的值是8), a=arr2;后 sizeof(a);的值依然还是4, 虽然此时a指向的数组arr2的大小是12(即 sizeof(arr2); 的值是12)。
4.
假设有函数:
float average(float *a)
则每次调用它时,a都是指向实参的,但由以上3可知, sizeof(a);的值都是4(即不受传递的实参的影响)。
5.
假设有函数定义
float average(float a[10],int arrlen)
和实参定义
float arr1[]=2,1, arr2[3]=2,1,3;
则可以这样调用这个函数
float r=average(arr1,sizeof(arr1));
或
float r=average(arr1,2);
当传递arr2时,也一样 float r=average(arr2,sizeof(arr2));或 float r=average(arr2,3);
5.应该是:
假设有函数定义
float average(float a[10],int arrlen)
和实参定义
float arr1[]=2,1, arr2[3]=2,1,3;
则可以这样调用这个函数
float r=average(arr1,sizeof(arr1)/4);
或
float r=average(arr1,2);
或
float r=average(arr1,sizeof(arr1)/sizeof(float));
当传递arr2时,也一样 float r=average(arr2,sizeof(arr2)/4);
或 float r=average(arr2,3);
或
float r=average(arr2,sizeof(arr2)/sizeof(float));
int
oid_check(struct
snmp_seq
sp,
struct
rmc1207
*
ramp,
int
buffer_size);
函数调用:
flag=oid_check(sp,
ramp,
buffer_size);
-------------------------------------------------------------------------------
在这里,
ramp
是结构体数组的指针
c语言中函数memset()是啥意思?啥功能
如题
memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。 memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。其函数原型为:void *memset(void*,int,unsigned);
其中void*表示地址
memset()的第一个实参是数组名,数组名作参数即数组作参数,它仅仅只是一个数组的起始地址而已。
实现第一个memset()函数调用的内存布局见图7-3。 在函数memset()栈区,从返回地址往上依次为第1,2,3个参数。第1个参数中的内容是main()函数中定义的数组ia1的起始地址。第2个参数是给数组设置的值(0),第3个参数是数组的长度(50*2)。函数返回时,main()函数的数组中内容全置为0。 参考技术A memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。 memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。其函数原型为:
void *memset(void*,int,unsigned);
其中void*表示地址
memset()的第一个实参是数组名,数组名作参数即数组作参数,它仅仅只是一个数组的起始地址而已。
实现第一个memset()函数调用的内存布局见图7-3。 在函数memset()栈区,从返回地址往上依次为第1,2,3个参数。第1个参数中的内容是main()函数中定义的数组ia1的起始地址。第2个参数是给数组设置的值(0),第3个参数是数组的长度(50*2)。函数返回时,main()函数的数组中内容全置为0。
中国物联网校企联盟技术部 参考技术B memset(地址指针, 值, 大小)将地址指向的区域连续大小的内存区域填充为值 参考技术C void *memset(void *s,int ch,size_t n);
函数解释:将 s 中前 n 个字节用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法.
请参考:
http://baike.baidu.com/view/982208.htm
以上是关于c语言中数组名作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章