C语言指针基础知识点(五)--用数组名作函数参数

指针系列目录

  C语言指针基础知识点(一)–指针及指针变量
  C语言指针基础知识点(二)–指针变量的引用
  C语言指针基础知识点(三)–指针变量作为函数参数
  C语言指针基础知识点(四)–通过指针引用数组
  C语言指针基础知识点(五)–用数组名作函数参数
  C语言指针基础知识点(六)–通过指针引用多维数组
  C语言指针基础知识点(七)–通过指针引用字符串
  C语言指针基础知识点(八)–返回指针值的函数
  C语言指针基础知识点(九)–指针数组和多重指针
  C语言指针基础知识点(十)–动态内存分配与指向它的指针变量

用数组名做函数参数

数组元素作实参时,参数传递具有单向性,即实参的改变可以影响形参,而形参的改变无法影响实参。例:

假设已经定义了一个函数,其原型为:

void swap(int x, int y);

假设函数的作用是将两个形参(x, y)的值交换,今有以下的函数调用:

swap(int a[1], int a[2]);

但是,

当数组名作函数参数时,实参和形参的改变可以相互影响。因为实参数组名代表首元素的地址,而形参是用来接收从实参传递过来的数组首元素的地址的,因此形参是一个指针变量。

int main()
{
	void fun(int arr[], int n);  //对fun函数的声明
	int array[10];
    ......
	fun(array, 10);   // 用数组名作函数的参数
	return 0;
}

void fun(int arr[], int n)
{
       ......
}

下面,把变量名作为函数参数与把数组名作为函数参数相互比较,可以得到:

实参类型变量名数组名
要求形参的类型变量名数组名或指针变量
传递的信息变量的值实参数组首元素的地址
通过函数调用能否改变实参的值不能

栗子1:

将数组 a 中 n 个整数按相反顺序存放

方法1:

# include<stdio.h>

int main()
{
	void inv(int x[], int n);
	int i, a[10];

	printf("Please enter 10 integer numbers:\n");
	for(i=0;i<10;i++)
		scanf("%d", &a[i]);

	inv(a,10);
	
	printf("The array has been inverted:\n");
	for(i=0;i<10;i++)
		printf("%d ", a[i]);
	
	printf("\n");
	return 0;
}

void inv(int x[], int n)
{
	int temp, j;

	for(j=0;j<=(n-1)/2;j++)
	{
		temp = x[j];
		x[j] = x[n-j-1];
		x[n-j-1] = temp;
	}
}

在这里插入图片描述
利用指针变量当形参

方法2:

# include<stdio.h>

int main()
{
	void inv(int *x, int n);
	int i, a[10];

	printf("Please enter 10 integer numbers:\n");
	for(i=0;i<10;i++)
		scanf("%d", &a[i]);

	inv(a,10);
	
	printf("The array has been inverted:\n");
	for(i=0;i<10;i++)
		printf("%d ", a[i]);
	
	printf("\n");
	return 0;
}

void inv(int *x, int n)
{
	int temp, j, m=(n-1)/2;
	
	for(j=0;j<=m;j++)
	{
		temp = *(x+j);
		*(x+j) = *(x+n-j-1);
		*(x+n-j-1) = temp;
	}
}

方法3:

# include<stdio.h>

int main()
{
	void inv(int *x, int n);
	int i, a[10];

	printf("Please enter 10 integer numbers:\n");
	for(i=0;i<10;i++)
		scanf("%d", &a[i]);

	inv(a,10);
	
	printf("The array has been inverted:\n");
	for(i=0;i<10;i++)
		printf("%d ", a[i]);
	
	printf("\n");
	return 0;
}

void inv(int *x, int n)
{
	int temp, *i, *j, *p, m=(n-1)/2;

	i=x; j=x+n-1; p=x+m; 

	for(;i<=p;i++,j--)
	{
		temp = *i;
		*i = *j;
		*j = temp;
	}
}


如果让指针变量做形参,必须先使指针变量有确定值,指向一个已定义的对象

栗子2:

用指针方法对10个整数按由小到大顺序排列

方法1:

# include<stdio.h>

int main()
{
	void sort(int x[], int n);
	int i, a[10], *p;
	p = a;

	printf("Please enter 10 integer numbers:\n");
	for(i=0;i<10;i++)
		scanf("%d", p++);

	p = a;   // 重新返回指向首地址
	sort(p,10);
	
	printf("The array has been inverted:\n");
	p = a;
	for(i=0;i<10;i++,p++)
		printf("%d ", *p);
	
	printf("\n");
	return 0;
}

void sort(int x[], int n)
{
	int i, j, k, temp;
	
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(x[i]<x[j])
			{
				temp = x[i];
				x[i] = x[j];
				x[j] = temp;
			}
		}
	}
}

方法2:

形参为指针

# include<stdio.h>

int main()
{
	void sort(int *x, int n);
	int i, a[10], *p;
	p = a;

	printf("Please enter 10 integer numbers:\n");
	for(i=0;i<10;i++)
		scanf("%d", p++);

	p = a;
	sort(p,10);
	
	printf("The array has been inverted:\n");
	p = a;
	for(i=0;i<10;i++,p++)
		printf("%d ", *p);
	
	printf("\n");
	return 0;
}

void sort(int *x, int n)
{
	int i, j, k, temp;
	
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(*(x+i)<*(x+j))
			{
				temp = *(x+i);
				*(x+i) = *(x+j);
				*(x+j) = temp;
			}
		}
	}
}

在这里插入图片描述

  • 23
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值