C语言 数组作为函数参数

img

img


为什么第一个程序数组作为函数参数时,用指针接受(求字符串长度
第二个程序数组作为函数参数时没用
(五个学生的成绩 求平均值
区别在哪里??

你好!

数组传参有如下两个形式。


//这种方式也可以改变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

img


正确的示范:

#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;
}

img

简单来说两种方法都一样,只不过指针的占用空间少