数组元素倒置(指针做参数,数组名做参数)

数组元素倒置

废话不多说,直接看代码:

1.指针做参数

#include <stdio.h>
int main()
{ 
     void inv(int *x,int n);//函数声明

     int i;
     int a[10]={3,4,8,15,78,46,25,12,18,16};

     printf("The original array:\n");

     for(i=0; i<10; ++i)
       {
	 printf("%d ", a[i]);
       } 

     printf("\n");

     inv(a,10);//调用inv()函数实现倒置

     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)//这里一定是*x,使得返回去的值是交换后的。
{
     int *p, temp, *i, *j, m = (n-1)/2;
     i = x; 
     j = x+n-1;
     p = x+m;

     for(; i<=p; i++,j--)//这里其实就是用指针交换了*i和*j的值
       {
         temp = *i;
         *i = *j;
         *j = temp;
       }

     return;
}

运行结果:

其实重在传参,

当我们把一个指针作为参数传给一个函数时,(如果不加*,直接传x)其实是把指针的副本传递过去了,也可以说传递指针是指针的值传递。

如果这时我们在函数内部修改,相当于只是修改了指针的副本而不是指针本身,原来的指针还保留着原来的值。这显然不是我们想要的。

要使函数能真真正正的修改指针的值,必须修改指针所指内存空间里面的值。那么,我们该如何去做呢?

当然是把这个“内存空间"给函数"传"过去,让函数直接操作这个空间就行了,做法就是把*x传给函数(一定是带*的哦!)

2.当 数组名做参数时
 

#include <stdio.h>
int main()
{ 
    void inv(int x[],int n);

    int i,a[10]={3,4,8,15,78,46,25,12,18,16};
    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 = n-1, m = (n-1)/2;

     for(i=0; i <= m; i++,j--)//原理跟上面差不多,就是借用了数组
       {
         temp = x[i];
         x[i] = x[j];
         x[j] = temp;
       }

     return;
}

 当然运行结果跟上面也是一样的:

关于数组名作函数参数以下几点需注意: 

一、先搞清楚数组名、数组首地址和整个数组的地址三者之间的关系

     1、 数组名代表的就是数组的首地址;

     2、整个数组的地址,可以用首地址“代替”,因为数组在内存中是连续的,知道首地址就相当于知道整个数组地址了;


 二、当数组名作函数的参数时,传递的是数组的起始地址,这时,也就相当于知道整个数组地址了。然后该咋操作就咋操作就行了。

再附带几个较为基础的数组方面的问题: 

1.100到200不能被3 整除的数 :

#include <stdio.h>
int main()
{
    int n;

    for(n=100; n <= 200; ++n)
     { 
       if(n%3 == 0)
       continue;
       printf("%5d", n);
     }
   printf("\n");
   return 0;
}

运行结果:

2.打印二维数组

#include <stdio.h>
int main()
{
    int b[3][2], i, j;
    int a[2][3] = {{1,2,3}, {4,5,6}};

    printf("array a:\n");

    for (i=0; i<=1; ++i)
     {
       for(j=0; j<=2; ++j)
        {
           printf("%5d", a[i][j]);
           b[j][i] = a[i][j];
        }
       printf("\n");
     }

    printf("array b:\n");

    for(i=0; i <= 2; ++i)
     {
       for(j=0; j<=1; ++j)
        {
           printf("%5d", b[i][j]);
        }
       printf("\n");
     }

    return 0;
}

 运行结果:

3.求三行四列中的最大数:

#include <stdio.h>
int main()
{
   int i, j, row=0, colum=0, max;
   int a[3][4]={{1,2,3,4}, {9,8,7,6}, {-10,10,-5,2}};
   max = a[0][0];

   for(i=0; i<=2; ++i)
    {
      for(j=0; j<=3; ++j)
       { 
         while(a[i][j] > max)//若求最小的只要将 > 改为 < 即可
          {
            max = a[i][j];
            row = i;
            colum = j;
          }
       }
    }
   printf("max=%d\n row=%d\n colum=%d\n", max, row, colum);

   return 0;
}

 运行结果:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值