把数组名作函数参数的四种情况
思路
实参与形参的对应关系有以下四种情况
我们来看代码
一般函数作参数和数组名作参数区别
一般函数作参数
数组名作函数参数
把数组名作函数参数的四种情况如果想要通过函数调用得到n个要改变的值
思路①在主函数中设n个变量,用n个指针变量指向它们
②设计一个函数,有n个指针形参,在这个函数中改变这n个形参所指向的值
③在主函数中调用这个函数,在调用时将n个指针变量做为实参,将它们的地址传给该函数的形参
④在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值
⑤主调函数中就可以使用这些改变了值的变量
同样,数组是一些连续变量的容器,当然也可以通过函数也改变数组中的值。
如果有一个实参数组,想要在函数中改变此数组中的元素的值
实参与形参的对应关系有以下四种情况1.实参和形参都是数组名
2.实参是数组名,形参是指针变量
3.实参是指针变量,形参是数组名
4.实参和形参都是指针变量
我们来看代码1.实参和形参都是数组名
# include <stdio.h>
//实参用属组名,形参也用数组名
int main(void)
{
void inv(int arr[], int n);
int array[10], i;
printf("Please enter ten integer numbers: \n");
for (i=0; i<10; i++)
scanf("%d", &array[i]);
printf("original array:\n");
for (i=0; i<10; i++)
printf("%2d", array[i]);
printf("\n");
inv(array, 10);
printf("reversed array:\n");
for (i=0; i<10; i++)
printf("%2d", array[i]);
printf("\n");
return 0;
}
void inv(int arr[], int n)
{
int temp, m, i;
m = (n-1)/2
;
for (i=0; i<=m; i++)
{
temp = arr[i];
arr[i] = arr[n-1-i];
arr[n-1-i] = temp;
}
}
2.实参是数组名,形参是指针变量
# include<stdio.h>
//实参用数组名,形参使用指针变量
int main(void)
{
void inv(int * p, int n);
void inv2(int * p, int n);
int array[10], i;
printf("Please enter ten integer numbers: \n");
for (i=0; i<10; i++)
scanf("%d", &array[i]);
printf("original array:\n");
for (i=0; i<10; i++)
printf("%2d", array[i]);
printf("\n");
inv2(array, 10);
printf("reversed array:\n");
for (i=0; i<10; i++)
printf("%2d", array[i]);
printf("\n");
return 0;
}
void inv(int * p, int n)
{
int temp, i, m; //定义普通变量
m = (n-1)/2;
for (i=0; i<=m; i++)
{
temp = *(p+i); //使用指针指向的值进行交换
*(p+i) = *(p+n-1-i);
*(p+n-1-i) = temp;
}
}
void inv2(int * p, int n)
{
int * i, temp, * j, m; //定义指针变量
j = p+n-1;
m = (n-1)/2;
for (i=p; i<p+m; i++, j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
4.实参和形参都是指针变量
# include<stdio.h>
//使用指针变量作实参,指针变量作形参
int main(void)
{
void inv3(int * p, int n);
void inv4(int * p, int n);
int array[10], i, * p;
p = array;
printf("Please enter ten integer numbers: \n");
for (i=0; i<10; i++)
scanf("%d", &array[i]);
printf("original array:\n");
for (i=0; i<10; i++)
printf("%2d", array[i]);
printf("\n");
inv4(p, 10);
printf("reversed array:\n");
for (i=0; i<10; i++)
printf("%2d", array[i]);
printf("\n");
return 0;
}
void inv3(int * p, int n)
{
int i, temp, m;
m = (n-1)/2;
for (i=0; i<=m; i++)
{
temp = *(p+i);
*(p+i) = *(p+n-1-i);
*(p+n-1-i) = temp;
}
}
void inv4(int * p, int n)
{
int * i, * j, temp, m;
m = (n-1)/2;
j = p+n-1;
for (i=p; i<=p+m; i++, j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
其中在inv函数中,无论是使用指针变量还是使用数组名,改变的只是实参指针变量所指向的变量的值。
牢记一句话(我认为是学习指针的重中之重,以不变应万变):
C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量作函数参数同样要遵循这一规则。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指向变量的值。
一般函数作参数和数组名作参数区别此次区别的分析来源于实践之后…
代码示例:
一般函数作参数#include<stdio.h>
void main()
{
float a,b;
float add(float a,float b);
scanf("%f%f",&a,&b);
add(a,b);
printf("输出主函数的a=%f\n",a);
}
float add(float a,float b)
{
a=a+b;
printf("输出子函数的a=%f\n",a);
return a;
}
运行结果:
数组名作函数参数#include<stdio.h>
void main()
{
float a[1],b;
float add(float a[],float b);
scanf("%f%f",&a[0],&b);
add(a,b);
printf("输出主函数的a=%f\n",a[0]);
}
float add(float a[],float b)
{
a[0]=a[0]+b;
printf("输出子函数的a=%f\n",a[0]);
}
运行结果:
原理解释:
由代码一输出结果可知,一般函数作参数(在子函数中),其形参数据不能够改变实参数据的。所以输出主函数的a=3.000000
由代码二输出结果可知,数组名作函数参数(尤其在子函数中)可通过形参(指针变量)是可以改变实参数据的。这突显了数组的普适性,功能性强优于其他一般函数。(个人拙见)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持易知道(ezd.cc)。