C语言-数组名作函数参数的四种情况

人之所以痛苦,那是因为你在成长。--------magic_guo

如果想要通过函数调用得到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语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量作函数参数同样要遵循这一规则。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指向变量的值。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值