數組元素倒置(指針做參數,數組名做參數)

數組元素倒置

廢話不多說,直接看代碼:

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

 運行結果:

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章