指针学习(3)

用数组名作函数参数:
数组名表示的是数组首地址,故以数组名作为实参传递时,形参是可以存放该实参类型的指针变量的。

表示形式:

  1. void fun(int arr[],int n);
  2. void fun(int *arr,int n);
    两种表示形式是等价的。

说明
C语言调用函数时虚实结合的方法都是采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,而当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量

示例:
将数组a中n个整数按相反顺序存放;

#include<stdio.h>
void reverse(int a[],int n);
int main()
{
    
    
	int a[10]={
    
    2,4,3,1,5,0,9,8,7,6};
	int i;
	printf("输出原始数据!\n");
	for(i=0;i<10;i++)
	{
    
    
		printf("%d",a[i]);
	}
    reverse(a,10);
	printf("按相反顺序存放后\n");
	for(i=0;i<10;i++)
	{
    
    
		printf("%d",a[i]);
	}
	printf("\n");
	return 0;
}
void reverse(int a[],int n)
{
    
    
	int t,i,j,m;
	m=(n-1)/2;
	for(i=0;i<=m;i++)
	{
    
    
		j=n-1-i;
		t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
}

子函算法属于典型的折半类型。
子函这一段可以用指针,这里让我知道地址可以累加…且配合相加相应顺序数字可表示该元素。

void reverse(int *a,int n)
{
    
    
	int *p,t,*i,*j,m;
	m=(n-1)/2;
	i=a;//不加数字时是指数组第一个元素
	j=a-1+n;//指向的是数组最后一个元素
	p=a+m;
	for(;i<=p;i++,j--)
	{
    
    
		
		t=*i;
		*i=*j;
		*j=t;
	}
}

猜你喜欢

转载自blog.csdn.net/yooppa/article/details/112796000