一般在C、C++中,数组作为函数传递的方式一般有两种传递方法,一种是function(int a[]); 另一种是function(int *a),为了使函数更加通用,一般还要在后面加上数组的长度,即:function(int a[],int num)和function(int *a,int num)。下面直接看看两种传递的结果。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Array(int a[],int num)
{
int num1;
num1=sizeof(a)/sizeof(a[0]);
printf("原来数组的长度是%d\n",num);
printf("第一种方法传递数组的长度是%d\n",num1);
}
void Array1(int *a,int num)
{
int num1;
num1=sizeof(a)/sizeof(a[0]);
printf("原来数组的长度是%d\n",num);
printf("第二种方法传递数组的长度是%d\n",num1);
}
int main()
{
int num;
int a[]={27,39,14,5,26,54,33,445,223};
num=sizeof(a)/sizeof(a[0]);
Array(a,num);
Array1(a,num);
system("pause");
return 0;
}
原因是为了迅速的计算数组,仅仅把数组的内存首地址作为传递变量,节约了许多缓存。而且其实单独的数组名代表的也是数组的内存首地址。
那么意思是数组也可以用指针的形式来表达,指针一样可以表达数组。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Array(int *a,int num)
{
int num1;
num1=sizeof(a)/sizeof(a[0]);
printf("原数组形式表达 a[3]=%d\n\n",a[3]);
printf("指针表达方式1 *(a+3)=%d\n\n",*(a+3));
printf("指针表达方式2 *a+3=%d\n\n",*a+3);
}
int main()
{
int num;
int a[]={1,2,3,4,5,6,7};
num=sizeof(a)/sizeof(a[0]);
Array(a,num);
system("pause");
return 0;
}
我们发现a[3] 、*a+3与*(a+3)都是一样的效果。但是本质不一样,a[3]与*(a+3)都是对地址增加了三个整型数据字节的地址单元,从而得到a[3]的地址,从而取值。而*a+3是对a的首地址取值后等于1,然后加3等于4.是对整数进行操作。