指针系列目录

  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;
			}
		}
	}
}

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐