C与指针——数组作为函数参数

数组和指针之间有紧密联系,那接下来我们来看看数组作为函数参数传入会有哪些情况

首先,我们先看看以下一个程序:

#include<stdio.h>

int SumOfElements(int A[],int size)
{
    int i,sum=0;
    for(i=0;i<size;i++)
    {
        sum+=A[i];
    }
    return sum;
}

int main()
{
    int A[]={1,2,3,4,5};
    int size,total;
    size=sizeof(A)/sizeof(A[0]);//size代表数组长度,数组长度计算用数组所占总字节除以一个数组元素所占直接个数
    total=SumOfElements(A,size);

    printf("Sum of elements=%d\n",total);
    return 0;
}

运行后出现如下结果:

 那么,接下来,我们对这个程序进行略微的改动,不把数组大小作为额外的参数传进去,而在函数里面计算数组的大小,

#include<stdio.h>

int SumOfElements(int A[])
{
    int i,sum=0;
    int size=sizeof(A)/sizeof(A[0]);
    for(i=0;i<size;i++)
    {
        sum+=A[i];
    }
    return sum;
}

int main()
{
    int A[]={1,2,3,4,5};
    int total;
    total=SumOfElements(A);

    printf("Sum of elements=%d\n",total);
    return 0;
}

会出现什么结果呢?

为什么呢?让我们在程序中加printf看看:

#include<stdio.h>

int SumOfElements(int A[])
{
    int i,sum=0;
    int size=sizeof(A)/sizeof(A[0]);
    printf("SOE—size of A=%d,size of A[0]=%d\n",sizeof(A),sizeof(A[0]));
    for(i=0;i<size;i++)
    {
        sum+=A[i];
    }
    return sum;
}

int main()
{
    int A[]={1,2,3,4,5};
    int total;
    total=SumOfElements(A);

    printf("Sum of elements=%d\n",total);
     printf("main—size of A=%d,size of A[0]=%d\n",sizeof(A),sizeof(A[0]));
    return 0;
}

这时我们运行:

为什么在sumofselements函数中A的大小是4个字节,而在main函数中则是20个字节呢?(这里用到编译器是VC++6.0,不同编译器可能不一样)

因为:

当编译器看到数组作为函数参数的时候,它不会拷贝整个数组,实际上编译器做的事,仅仅是创建一个同名的指针(而不是整个数组),在这里我们就是一个整型指针,编译器只是拷贝主调函数的首元素地址,我们假设main函数中数组首元素的地址是200,因此,在函数sumofelements,仅仅是创建一个整型指针,里面存放的值是200,编译器隐式地int A[]转换成int *A,也就是说,这里的A不是被解释成数组,而是被解释为,一个整型指针,因此不管你写成int A[],还是int *A,它们都是一样的

这里我们不是拷贝变量的值,而仅仅只是拷贝变量的地址,因此,这里是传引用,数组总是作为引用来传给数组,这很有意义,因为数组可以很大,每次拷贝整个数组没有意义,它会消耗大量内存,因此对于数组来讲,不使用传值方式,而是传引用。

这就是为什么我们打印出来的函数里的A是4个字节,而main函数里的A是20个字节,因为在函数中A是一个指针,而在main函数里A是一个数组

好,接下来再看一个程序,我们试试用指针数组将A[]的值扩大一倍

#include<stdio.h>

void Double(int *A,int size)//int *A与int A[]是一样的
{
    int i,sum=0;
    for(i=0;i<size;i++)
    {
       A[i]=2*A[i];
    }
}

int main()
{
    int A[]={1,2,3,4,5};
    int size=sizeof(A)/sizeof(A[0]);
    Double(A,size);
    int i;
    for(i=0;i<size;i++)
    {
        printf("%d ",A[i]);
    }
    return 0;
}

运行结果:

 同一个数组A通过指针的解引用被修改了

以上就是数组作为函数的一个重要用例

(要开始学指针了(枯))

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值