数组元素倒置
废话不多说,直接看代码:
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;
}
运行结果: