數組元素倒置
廢話不多說,直接看代碼:
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;
}
運行結果: