这一部分,我们直接通过例子来解释
例:将数组a中n个整数按相反顺序存放。
#include <stdio.h> int main(){ void inv(int x[],int n); int i,a[10] = {3,7,9,11,0,6,7,5,4,2}; 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,m=(n-1)/2; for(i=0;i<=m;i++){ j = n-1-i; temp = x[i]; x[i] = x[j]; x[j] = temp; } return; }
上面的例子中,我们定义了一个函数inv,实参用数组名a,形参用的可以数组名。
因为形参数组名实际上是一个指针变量,所以说,当我们颠倒形参的值时,实际上就是在颠倒实参数组的值。
下面,我们将上例中的形参数组,改成指针变量,
#include <stdio.h> int main(){ void inv(int *x, int n); int i,a[10] = {3,7,9,11,0,6,7,5,4,2}; 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 *p,temp,*i,*j,m=(n-1)/2; i = x;j=x+n-1; p = x+m; for(;i<=p;i++,j--){ temp = *i; *i = *j; *j = temp; } return; }
上述例子中和先前的例子一样,首先,不管如何,我们都要先获得,第一个元素的地址 ,和最后一个元素的地址,还有中间元素的元素地址,
因为形参是指针,所以我们定义了三个指针变量,用于存放数组的三个地址,
然后我们就可以通过地址来获取指针的值,替换即可。
下面,我们在改下程序,用指针变量作实参
#include <stdio.h> int main(){ void inv(int * x, int n); int i,arr[10],*p = arr; printf("The original array:\n"); for(i=0;i<10;i++,p++) scanf("%d",p); printf("\n"); p = arr; inv(p,10); printf("The array has been inverted:\n"); for(p = arr;p<arr+10;p++) printf("%d ",*p); printf("\n"); return 0; } void inv(int *x, int n){ int *p,m,temp,*i,*j; m = (n-1)/2; i=x;j=x+n-1;p=x+m; for(;i<=p;i++,j--){ temp = *i; *i = *j; *j = temp; } return ; }
上面的例子,我们只要抓住指针和地址的定义,就可以很好的理解了。
在给一个有关排序的例子
例:用指针方法对10个整数按由大到小的顺序排序。
#include <stdio.h> int main(){ void sort(int x[],int n); int i,*p,a[10]; p = a; printf("please enter 10 integer numbers:"); for(i=0;i<10;i++) scanf("%d",p++); p = a; sort(p,10); for(p = a,i=0;i<10;i++){ printf("%d ",*p); p++; } printf("\n"); return 0; } void sort(int x[] ,int n){ int i,j,k,t; for(i=0;i<n-1;i++){ k = i; for(j=i+1;j<n;j++){ if(x[j]>x[k]) k = j; if(k!=i){ t=x[i]; x[i]=x[k]; x[k]=t; } } } }
上述例子中,我们只在main函数体中用了指针,分别用于输入和输出参数。
下面,我们把形参改成指针的形式
#include <stdio.h> int main(){ void sort(int x[],int n); int i,*p,a[10]; p = a; printf("please enter 10 integer numbers:"); for(i=0;i<10;i++) scanf("%d",p++); p = a; sort(p,10); for(p = a,i=0;i<10;i++){ printf("%d ",*p); p++; } printf("\n"); return 0; } void sort(int *x ,int n){ int i,j,k,t; for(i=0;i<n-1;i++){ k = i; for(j=i+1;j<n;j++){ if(*(x+j>*(x+k)) k = j; if(k!=i){ t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; } } } }