1.数组的颠倒:若有10个数字,那么数组的颠倒即
a[0]与a[9]交换,a[1]与a[8]交换,a[2]与a[7]交换,......a[4]与a[5]交换,所以到a[4]就颠倒完毕,即
(n-1)/2
若不用指针代码如下
#include<stdio.h> void fun(int s[],int n) { int i,temp,m=(n-1)/2; for(i=0;i<=m;i++) { int j=n-1-i; temp=s[i]; s[i]=s[j]; s[j]=temp; } return; } int main() { int s[10]={1,2,3,4,5,6,7,8,9,10}; fun(s,10); for(int i=0;i<10;i++) { printf("%d\n",s[i]); } return 0; }
若使用指针,则指针变量的位置如图所示
#include<stdio.h> void fun(int *x,int n) { int *p,*i,*j,temp,m=(n-1)/2; i=x; p=x+m; j=x+n-1; for(;i<=p;i++,j--) { temp=*i; *i=*j; *j=temp; } return; } int main() { int s[]={1,2,3,4,5,6,7,8,9,10}; fun(s,10); for(int i=0;i<10;i++) { printf("%d\n",s[i]); } return 0; }
2.数组的排序,代码如下
#include<stdio.h> #include<string.h> void fun(int *x,int n)//void fun(x[],int n) { int i,j,temp; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(*(x+i)<*(x+j)) //(x[i]<x[j]) { temp=*(x+i); *(x+i)=*(x+j); *(x+j)=temp; } } } return; } /*也可以写为 int t; for(int i=0;i<n-1;i++) { k=i; for(int j=0;j<n;j++) { if(*(x+i)>*(x+k)) k=j; if(k!=i) {t=*(x+i);*(x+i)=*(x+k),*(x+k)=t;} } } 效果相同 */ int main() { int a[10]={1,2,3,4,5,6,7,8,9,10}; fun(a,10); for(int i=0;i<10;i++) { printf("%d\n",a[i]); } return 0; }
3.二维数组的表示
查找有一门以上课程不及格的学生,输出他们的全部课程的成绩
代码如下
#include<stdio.h> void search(float(*p)[4],int n)//p指向包含4个float型元素的一维数组的指针变量 { int i,j,flag; for(j=0;j<n;j++) { flag=0; for(i=0;i<4;i++) { if(*(*(p+j)+i)<60) flag=1; } if(flag==1) { printf("第%d名学生有一门及以上的成绩不及格,他的成绩是:\n",j+1); for(i=0;i<4;i++) printf("%5.1f ",*(*(p+j)+i));//score[j][i] printf("\n"); } } } int main() { float score[3][4]={{65,57,70,60},{58,87,90,81},{90,99,100,98}}; search(score,3); return 0; }
结果显示