實參數組名代表該數組首元素的地址,而形參是用來接收從實參傳遞過來的數組首元素地址,因此形參應該是一個指針變量(隻有指針變量才能存放地址)。實際上,C語言編譯係統都是將形參數組名作為指針變量來處理的。如果數組是一維數組,則按指向數組元素的指針來處理;如果數組是二維數組,則按指向由m個元素的一維數組的指針變量來處理。例如,函數f的形參寫成一維數組的形式:
f(intarr[],intn)
但在編譯時則將一維數組名arr按指針變量處理,相當於將函數f的首部寫成
f(int*arr,intn)
以上兩種寫法是等價的。在調用該函數時,係統會建立一個指針變量arr,用來存放從主調函數傳遞過來的實參數組首元素的地址。同樣的道理:
f(intarr[][3],intn)與f(int(*arr)[3],intn)
兩種寫法也是等價的。
[例1014]將數組a中n個整數按相反順序存放。
(1)設置三個變量i、j、m,初始化i=0,j=n-1,m=n/2。
(2)將a[i]和a[j]的值交換,然後使i=i+1。
(3)當i的值小於m的值就轉到(2),直到i的值等於m的值為止。
voidinverse(intx[],intn)
{
inttemp,i,j,m=n/2;
for(i=0;i
{
j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;
}
}
voidprint(intx[],intn)
{
inti;
for(i=0;i
printf("%d",x[i]);
printf("\n");
}
main()
{
inta[10]={0,1,2,3,4,5,6,7,8,9};
print(a,10);
inverse(a,10);
print(a,10);
}
輸出結果為:
0123456789
9876543210
在程序中,形參和實參都為數組名,對這個程序可以作如下改動:
voidinverse(int*x,intn)
{
int*p,temp,*y,m=n/2;
y=x+n-1;p=x+m;
for(;x
{
temp=*x;*x=*y;*y=temp;
}
}
voidprint(intx[],intn)
{
inti;
for(i=0;i
printf("%d",x[i]);
printf("\n");
}
voidmain()
{
inta[10]={0,1,2,3,4,5,6,7,8,9},*p;
p=a;