指针-用数组名作函数参数

这一部分,我们直接通过例子来解释


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

 

 

#include <stdio.h>

int main(){
    void inv(int x[],int n);
     int i,a[10] = {3,7,9,11,0,6,7,5,4,2};
     printf("The original array:\n");
     for(i=0;i<10;i++)
        printf("%d",a[i]);
     printf("\n");
     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,m=(n-1)/2;
     for(i=0;i<=m;i++){
         j = n-1-i;
         temp = x[i];
         x[i] = x[j];
         x[j] = temp;

     } 
     return; 
}

 

 


上面的例子中,我们定义了一个函数inv,实参用数组名a,形参用的可以数组名。


因为形参数组名实际上是一个指针变量,所以说,当我们颠倒形参的值时,实际上就是在颠倒实参数组的值。



下面,我们将上例中的形参数组,改成指针变量,

 

 

#include <stdio.h>
int main(){
    void inv(int *x, int n);
    int i,a[10] = {3,7,9,11,0,6,7,5,4,2};
    printf("The original array:\n");
    for(i=0;i<10;i++)
         printf("%d ",a[i]);
    printf("\n");
    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 *p,temp,*i,*j,m=(n-1)/2;
    i = x;j=x+n-1; p = x+m;

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


}

 

 

上述例子中和先前的例子一样,首先,不管如何,我们都要先获得,第一个元素的地址 ,和最后一个元素的地址,还有中间元素的元素地址,


因为形参是指针,所以我们定义了三个指针变量,用于存放数组的三个地址,


然后我们就可以通过地址来获取指针的值,替换即可。


下面,我们在改下程序,用指针变量作实参

 

 

#include <stdio.h>
int main(){
   void inv(int * x, int n);
   int i,arr[10],*p = arr;
   printf("The original array:\n");
   for(i=0;i<10;i++,p++)
        scanf("%d",p);
   printf("\n");
   p = arr;
   inv(p,10);
   printf("The array has been inverted:\n");
   for(p = arr;p<arr+10;p++)
        printf("%d ",*p);
   printf("\n");
   return 0;
}


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


上面的例子,我们只要抓住指针和地址的定义,就可以很好的理解了。



在给一个有关排序的例子


例:用指针方法对10个整数按由大到小的顺序排序。

 

 

#include <stdio.h>
int main(){
      void sort(int x[],int n);
      int i,*p,a[10];
      p = a;
      printf("please enter 10 integer numbers:");
      for(i=0;i<10;i++)
          scanf("%d",p++);

      p = a;
      sort(p,10);
      for(p = a,i=0;i<10;i++){
           printf("%d ",*p);
           p++;
      }
      printf("\n");
      return 0;
}

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

 

上述例子中,我们只在main函数体中用了指针,分别用于输入和输出参数。


下面,我们把形参改成指针的形式

 

 

#include <stdio.h>
int main(){
      void sort(int x[],int n);
      int i,*p,a[10];
      p = a;
      printf("please enter 10 integer numbers:");
      for(i=0;i<10;i++)
          scanf("%d",p++);

      p = a;
      sort(p,10);
      for(p = a,i=0;i<10;i++){
           printf("%d ",*p);
           p++;
      }
      printf("\n");
      return 0;
}

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值