主程式陣列傳遞函式【關於記憶體位址】

關於主程式陣列傳遞到函式,為什麼不是像我們傳遞變數那樣直接複製其內容給予函式呢?在程式語言中複製一整個陣列數值代價是較大的,所以當主程式傳遞陣列到函式時,它傳遞的是陣列的第一個記憶體位址,例如int a[10],相當於陣列a有10個int(每個int佔4位元)連續存在記憶體的一個區塊,先假設第一個int起始為16800,第十個int位置就相當於16836(記憶體位址非舉例內容,只是用於舉例)。
在範例中,主程式傳遞陣列的不是複製數值(代價大),是傳遞記憶體位址給函式,所以在函式中讀取到的是該陣列在記憶體起始位址,所以我們在函式裡面有修改到陣列的內容,沒有回傳就會修改到陣列的內容,不同於傳遞一個變數,既使函式修改到傳遞進來的一般變數數值,也不會更改到主程式該變數內容,既使種程式變數名稱和函式變數名稱相同也不會影響,這點要多注意。

#include<stdio.h>
void test(int[],int);
int max(int[],int);
int main(){
int x[]={42,59,-5,69};
int a[]={11,5,9};
int b[]={52,69,30,86,98};
printf("a max= %d\n",max(a,3));
printf("b max= %d\n",max(b,5));
printf("\n\nA has %d value\nB use %d space\n\n",sizeof(a)/sizeof(int),sizeof(b));

test(x,4);
for(int i=0;i<4;++i){
printf("%d\n",x[i]);
}
return 0;
}
void test(int h[],int n){
int i;
for(i=0;i<n;++i){
h[i]=h[i]+10;
}
}

int max(int q[],int n){
int bigger=q[0],i;
for(i=1;i<n;++i){
if(q[i]>bigger){
bigger=q[i];
}
}
return bigger;
}

留言