数组和指针之间有紧密联系,那接下来我们来看看数组作为函数参数传入会有哪些情况
首先,我们先看看以下一个程序:
#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通过指针的解引用被修改了
以上就是数组作为函数的一个重要用例
(要开始学指针了(枯))