1.从前面的文章(形参与实参的区别)得知:当我们将一个数值作为实参传递到函数作为形参时,其实参和形参在内存空间的地址不相同,互不干扰。
#include<stdio.h>
void xiangJia(int data)
{
data = data + 100;
printf("%d\n",data);
}
int main()
{
int data = 10;
shuZu(data);
printf("%d",data);
}
结果:
由此我们能看出,在函数里,data进行了相加,最后输出的值为110.
而main函数里的的data因为是实际参数,与封装函数里的形参data无任何关系,所以还是输出10.
为了更直观,我们输出两个data的地址:
由图知两个data地址不同
2.当将数组名作为实参传递时,会发生一些有趣的事情
#include<stdio.h>
void shuZu(int data[])
{
data[0]=data[0]+100;
/*操作一定是相同内存空间,
数组名作实参,传递的是首地址*/
printf("%d\n",data[0]);
}
int main()
{
int data[]={10,20,30};
shuZu(data);
printf("%d",data[0]);
}
结果:
由此我们发现,同样是输出data[0],它们没有像上一个代码输出data时互不干扰,而是输出了相同的值,这是因为数组名作为实参传递到函数作形参时,有一个特殊的规则,在形式参数里,没有数组的概念,传递过来的是数组的首地址,所以,形参与实参是相同的内存地址。data[0]进行相加100后,改变的是相同地址的值,所以最后输出data[0]时是相同的数值。
为了更直观,我们输出两个data[0]的地址:
由图知两个data地址相同
3.二维数组做实参传递
#include <stdio.h>
//将二维数组做实参传递时,我们需在定义函数里定义一个二维数组形参int arr[][4]
void shuChu(int arr[][4],int hang,int lie)
{
int i,j;
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
printf("%d ",arr[i][j]);
}
puts("");
}
}
void getArry(int arr[][4],int hang,int lie)
{
int i,j;
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
printf("请输入第%d行,第%d个的值:",i+1,j+1);
scanf("%d",&arr[i][j]);
}
puts("");
}
}
int getMaxFromArry(int arr[][4],int hang,int lie)
{
int i,j;
int max=arr[0][0];
for(i=0;i<hang;i++)
{
for(j=0;j<lie;j++)
{
max=max<arr[i][j]?arr[i][j]:max;
}
}
return max;
}
int main()
{
int max;
int arr[3][4];
getArry(arr,3,4);
shuChu(arr,3,4);
max = getMaxFromArry(arr,3,4);
printf("3*4矩阵中最大值为%d",max);
return 0;
}
这是一段输出最大值的代码,通过getArry()函数输入二维数组的值,shuChu()函数输出二维数组里的值,getMaxFromArry()输出二维数组里的最大值,我们可以注意到,每个函数中都定义了一个二维数组int arr[][4]的形式参数来保存main函数里实参二维数组int arr[3][4]的地址。