1. 程式人生 > >陣列名,指標變數作函式引數的四種情況

陣列名,指標變數作函式引數的四種情況

函式的引數可以是變數,也可以是陣列。當整個陣列作為函式的引數時,實際上是陣列的地址作為引數。由於實參可以是表示式,陣列元素也可以是表示式的一部分,因此,陣列元素可以作為函式的實參,這時對應的形參應該是變數,與變數作實參一樣,陣列元素把他的值傳遞到系統為形參變數分配的臨時儲存單元中,是單向的“值傳遞”。

當陣列名作函式的引數時,傳遞到是陣列的起始地址,形參是用來接受從實參傳遞過來的實引數組的地址的。因此,形參應該是一個地址變數(只有指標才能存放地址)。陣列名就是陣列的首地址,實參向形參傳遞陣列名實際上就是傳送陣列的地址,形參得到該地址後也指向同一陣列。這就好像同一件物品有兩個彼此不同的名稱一樣。同樣,指標變數的值也是地址,陣列指標變數的值即為陣列的首地址,當然也可以作為函式的引數使用。

歸納起來,如果要把一個實際引數的起始地址傳遞到另一個函式中,實參和形參的表示形式可以有如下4種情況:

實參 形參
陣列名 陣列名
陣列名 指標變數
指標變數 陣列名
指標變數 指標變數

設計一個程式將n個數從大到小排序,主函式裡的實參為陣列名的情況為:

int main()
{
int a[N],i;
printf("input array a[%d]:\n",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
sort(a,N);
for(i=0;i<N;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}

實參用指標變數的情況為:

int main()
{
int a[N],i,*pa=a;
printf("input array a[%d]:\n",N);
for(i=0;i<N;i++)
scanf("%d",pa++);
pa=a;
sort(pa,N);
for(i=0;i<N;i++)
printf("%4d",*pa++);
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[k]<x[j])
k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}

形參用指標變數的情況為:

void sort(int *p,int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(*(p+k)<*(p+j))
k=j;
if(k!=i)
{
t=*(p+i);
*(p+i)=*(p+k);
*(p+k)=t;
}
}
}

將上述2個外部函式和兩個主函式任意各選一個組合起來,一共能得到4個不同的函式,4個函式都能實現程式的功能要求(將n個數從大到小排序)。執行結果如下: