你好!
数组传参有如下两个形式。
//这种方式也可以改变main方法中的数组元素的值
//缺点:每次都要传递5*4 20个字节的数组长度的数组形参
void f1(int a[]){
int i=0;
int len=GetLen(a);
for(;i<len;i++){
a[i]=i+10;
}
}
//这种方式也可以改变main方法中的数组元素的值
//优点:每次只要传递4个字节长度的指针变量即可
//缺点:数组的长度不好获取,在正常的开发中需要传入长度,当然也可以使用其他的方式获取
void f2(int * a){
int i;
int len=GetLen(*a);//$$1
printf("$$%d\n",len);
for(i=0;i<5;i++)
*(a+i)=i+20;
}
float aver(float a[5])
等价于float aver(float *a, int N = 5)
,这里面N是数组长度
所以也是指针
错误的示范:
#include <stdio.h>
float aver1(float a[]){
int i;
float av, s = a[0];
int len = sizeof(a) / sizeof(a[0]);
printf("数组a在aver1函数中的长度为:%d\n", len);
for(i = 1; i < len; i++){
s += a[i];
}
av = s / len;
return av;
}
float aver2(float *a){
int i;
float av, s = a[0];
int len = sizeof(a) / sizeof(a[0]);
printf("数组a在aver2函数中的长度为:%d\n", len);
for(i = 1; i < len; i++){
s += a[i];
}
av = s / len;
return av;
}
int main(){
float a[5] = {1, 2, 3, 4, 5};
int len = sizeof(a) / sizeof(a[0]);
printf("数组a在main函数中的长度为:%d\n", len);
printf("aver1=%f\n", aver1(a));
printf("aver2=%f\n", aver2(a));
return 0;
}
有warning
正确的示范:
#include <stdio.h>
float aver1(float a[], int len){
int i;
float av, s = a[0];
for(i = 1; i < len; i++){
s += a[i];
}
av = s / len;
return av;
}
float aver2(float *a, int len){
int i;
float av, s = a[0];
for(i = 1; i < len; i++){
s += a[i];
}
av = s / len;
return av;
}
int main(){
float a[5] = {1, 2, 3, 4, 5};
int len = sizeof(a) / sizeof(a[0]);
printf("aver1=%f\n", aver1(a, len));
printf("aver2=%f\n", aver2(a, len));
return 0;
}
简单来说两种方法都一样,只不过指针的占用空间少