作者:網易學院程序系教授管寧
以下兩個例子要非常注意,函數傳遞的不是數組中數組元素的真實值而是數組在內存中的實際地址!
/*程序作者:管寧
站點:www.cndev-lab.com
所有稿件均有版權,如要轉載,請務必著名出處和作者*/
#include <stdio.h>
void main(void)
{
void reversal();
static int a[10] = {0,1,2,3,4,5,6,7,8,9}; /* 建立一個數組並初始化 */
int i;
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("
");
reversal(a,10); /* 調用自定義涵數進行反向顯示排序,並把數組a的起始地址傳送給形式參數x */
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("
");
}
void reversal(x,n)
int x[],n; /* 定義形式參數 */
{
int m=(n-1)/2; /* 計算10個數需要循環幾次,因為是兩兩調換第一個數組是x[0]故應該是int(9/2) */
int temp,i,j; /* 建立零時變量temp用於每次交換處理時零時存儲x的值 */
for (i=0;i<=m;i++)
{
j=n-1-i; /* 反向計算出被調換的數組下標,例如x[0] 對應的x[n-1-i]就是x[9] */
temp=x;
x=x[j];
x[j]=temp;
}
}
/* 次題需要注意的是:這裡由於a[10]和x[10]是共同享內存地址位的所以進行交換後a[10]的實際值也就發生了改變 */
/*程序作者:管寧
站點:www.cndev-lab.com
所有稿件均有版權,如要轉載,請務必著名出處和作者*/
#include <stdio.h>
void main(void)
{
void reversal();
static int a[10] = {0,1,2,3,4,5,6,7,8,9}; /* 建立一個數組並初始化 */
int i;
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("
");
reversal(a,10); /* 調用自定義涵數進行反向顯示排序,並把數組a的起始地址傳送給形式參數x */
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("
");
}
void reversal(x,n)
int *x,n; /* 定義x為指針變量 */
{
int temp,*p,*i,*j; /* 這裡需要注意的是temp用與交換的時候臨時存儲數據的 */
i = x; /* 利用指針變量i存儲數組a的起始地址 */
p = x + ((n-1)/2); /* 計算最後一次循環的時候數組a的地址 */
j = x + n - 1; /* 計算數組a也就是a[9]的結束地址好用於交換 */
for (;i<=p;i++,j--) /* 利用循環和指針進行數組元素值的交換 */
{
temp=*i; /* 用temp臨時存儲*i也就是循環中a實際的值 */
*i=*j;
*j=temp;
}
}
/* 此例同樣要注意到利用指針進行數組的操作同樣改變了實際數組各元素的值 */