数组 [2] —— 传参、形参和计算

文章转载请注明出处,加上原文链接,谢谢!https://blog.csdn.net/weixin_46959681/article/details/111145714



使用函数实现数组传参

#include <stdio.h>

//数组传参时,形式参数中大小规定是必须的吗?
void arrayPrint(int datas[3])
{
    
     
        printf("数组datas[3]的大小是 %ld\n", sizeof(datas[3]));
        printf("数组datas[3]中一个元素大小是 %ld\n", sizeof(datas[0]));
}

int main(){
    
    

        int array[3] = {
    
    1, 2, 3};
  
        printf("数组array的大小为 %ld\n", sizeof(array));
        printf("数组array的元素个数为 %ld\n", sizeof(array)/sizeof(array[0]));
        putchar('\n');

        arrayPrint(array); 
        //使用数组名和数组第一个元素为什么能实现相同的效果?
        arrayPrint(&array[0]); 
        return 0;
}

运行结果:

数组array1的大小为 12
数组array1的元素个数为 3

数组datas[3]的大小是 4
数组datas[3]中一个元素大小是 4
数组datas[3]的大小是 4
数组datas[3]中一个元素大小是 4

注意: 结尾处的第一句程序传递的是数组名,第二句程序语句传递的是数组的第一个元素地址。但是两者在函数 arrayPrint() 里的实现是一致的。

根据程序运行的结果,我们可以自然的提出下面两个问题:

  1. 使用数组名和数组第一个元素为什么能实现相同的效果?
  2. 数组传参时,形式参数中大小规定是必须的吗?

|1. 使用数组名和数组第一个元素为什么能实现相同的效果?

arrayPrint(array); 
arrayPrint(&array[0]);

从数组 array 在计算机内存中的存储而特点而言,数组是有限个同类型变量的有序排列集合 ,其数据按顺序存储在内存的连续空间内(参考笔者的上一篇博文:数组 [1] —— 对比、实现和寄存器)。不论是数组名 array 又或是取数组的第一个元素 &array[0] ,都仅仅是指向数组第一个元素的 地址。 在这个意义上,使用 for 循环遍历数组才顺理成章。
array

|2. 数组传参时,形式参数中大小规定是必须的吗?

从封装的函数 arrayPrint() 层面而言,形式参数中的数组仅仅只是一个数组的样子而已,中括号中的代表大小的数字是无效的,该参数仅表示传递参数时的一个地址而已。因此,形参的参数根本不需要设置大小,例如前面代码中的参数 datas[3] 只需要写成 datas[] 就可以了。

int datas[] 虽然是一个形式参数(又是一个局部变量),但是也有自己的内存空间,其作用域仅限于该函数。

函数的参数传递机制涉及到CPU中的程序计数器、栈等相关概念,笔者会在相关博文中讨论,此处略过。


使用数组计算最大值、最小值和平均值

演示代码:

#include <stdio.h>

int main()
{
    
    
    int i = 0;
    int max = 0;
    int min = 0;
    int sum = 0;
    float average;
    
    int array[5] = {
    
    0}; 
 
    //赋值
    for(i = 0; i < 5; i++){
    
     
        printf("请输入第%d个数:\n",i+1);       
        scanf("%d",&array[i]);
    }
    
    //找出最大值,打印结果;    
    max = array[0]; 
    for(i = 0; i < 5; i++) {
    
     
        if(max < array[i]){
    
    
            max = array[i];
        }
    }
    printf("数组最大值为:%d\n",max);
     
    //找出最小值,打印结果;
    min = array[0];
    for(i = 0; i < 5; i++) {
    
     
        if(min > array[i]){
    
    
            min = array[i];
        }
    }
    printf("数组最大值为:%d\n",min);
    
    //计算平均值,打印结果。
    for(i = 0; i < 5; i++)
    {
    
     
        sum = sum + array[i]; 
    }
    //强制转换成浮点类型。
    average = (float)sum/5; 
    printf("数组的平均值为%f\n",average);
    return 0;
}

文章更新记录

  • 继上一篇博客后,以龟速完成了。「2020.12.22 16:54」
  • 代码格式调整。 「2021.1.18 14:03」
  • 代码格式调整。 「2021.2.4 22:32」

猜你喜欢

转载自blog.csdn.net/weixin_46959681/article/details/111145714