1.值傳遞
void swap(int x,int y) { int temp = x; x = y; y = temp; } void main() { int a = 10, b = 20; swap(a, b); }
執行后,並不會交換。
2.引用傳遞
void swap(int &x,int &y) { int temp = x; x = y; y = temp; } void main() { int a = 10, b = 20; swap(a, b); printf("a=%d\nb=%d\n", a, b); }
執行后,發生交換。
3.指針傳遞
void swap(int *x,int *y) { int temp = *x; *x = *y; *y = temp; } void main() { int a = 10, b = 20; swap(&a, &b); printf("a=%d\nb=%d\n", a, b); }
執行后,發生交換。
4.數組做參數,傳的到底是什么?
參數傳遞只有上面三種,但是如果加上數組,就會產生幾種新形式。
首先,明確數組型變量名本身只是該數組所占存儲空間的首地址:
int a[3] = { 1, 2, 3 }; int *p = a; //等價於下行 //int *p = &a[0]; printf("%d", *p);
》》》典型的數組做參數
void fun(char s[]){ for (int i = 0; s[i] != '\0'; i++) printf("%c", s[i]); } void main() { char str[] = "Hello World!"; fun(str); }
函數調用時,這里系統不會為形參分配數組存儲空間,而是僅僅分配一個存放數組地址(第一個元素地址)的存儲空間,此后,將實參數組的首地址傳遞給形參變量。其實本質與下相同,只不過還是數組形式的(數組名代替指針)。
》》》既然數組型變量名本身只是該數組所占存儲空間的首地址,我們當然可以用指針做形參來接收數組實參
void fun(char *p){ while (*p) { printf("%c", *p); p++; } } void main() { char str[] = "Hello World!"; fun(str); }
不過問題是如果這樣,無法把握數組結束(除非知道數組長度)。而對於字符數組(上例),由於字符串末尾有結束標志'\0'(ascii碼正好是0),所以就很容易利用指針來判斷字符串是否結束。