在定義函數時函數括號中的變量名成爲形式參數,簡稱形參或虛擬參數;在主調函數中調用一個函數時,該函數括號中的參數名稱爲實際參數,簡稱實參,實參能夠是常量、變量或表達式。ios
一、C語言中實參和形參之間的額數據傳遞是單向的「值傳遞」,單向傳遞,只能由實參傳給形參,反之不能。函數
二、被調用函數的形參只有函數被調用時纔會臨時分配存儲單元,一旦調用結束佔用的內存便會被釋放。spa
三、」按值傳遞「中包括值傳遞(實實在在的值啊!)和指針傳遞(指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值),傳遞的都是實參的一個拷貝。3d
主調函數向調用函數傳遞參數實際上只是將實參的拷貝(即臨時副本)傳遞給了被調用函數,並非實參自己,這樣被調函數不能直接修改主調函數中變量的值,而只能修改其私有的臨時副本的值。指針
一、例子1:值傳遞(實實在在的值啊)code
1 #include <stdio.h> 2 int main() 3 { 4 int a=2,b=3; 5 void swap(int x,int y); 6 printf("before:%d,%d\n",a,b); 7 swap(a,b); 8 printf("later:%d,%d\n",a,b); 9 return 0; 10 } 11 12 void swap(int x,int y) 13 { 14 int tmp; 15 tmp=x; 16 x=y; 17 y=tmp; 18 }
運行結果:對象
下面的例子體現了不論傳遞的是值仍是指針(指針也是一個值),傳遞給被調用函數的都是實參的一個拷貝,直接對拷貝進行操做不會影響實參blog
1 #include <stdio.h> 2 int main() 3 { 4 int a = 2, b = 3; 5 printf("before:%d,%d\n", a, b); 6 printf("---------------------------\n"); 7 printf("a所在的地址爲:%x\n", &a); 8 printf("b所在的地址爲:%x\n", &b); 9 printf("---------------------------\n"); 10 void swap(int* x, int* y); 11 swap(&a, &b); 12 printf("later:%d,%d\n", a, b); 13 return 0; 14 15 } 16 17 void swap(int* x, int* y) 18 { 19 printf("x所在的地址爲:%x\n", &x); 20 printf("y所在的地址爲:%x\n", &y); 21 printf("---------------------------\n"); 22 printf("x存儲的值爲:%x\n", x); 23 printf("y存儲的值爲:%x\n", y); 24 printf("---------------------------\n"); 25 int *tmp = NULL; 26 tmp = x; 27 x = y; 28 y = tmp; 29 //因此交換x,y只是交換了二者存儲的值(值爲a,b的地址),並無涉及到a,b的值的交換 30 //因此只是操做地址並無卵用 31 printf("x存儲的值爲:%x\n", x); 32 printf("y存儲的值爲:%x\n", y); 33 printf("---------------------------\n"); 34 }
運行結果:內存
可是能夠經過地址間接地改變實參的值(請參見例子2)string
二、例子2:指針傳遞
#include <stdio.h> int main() { int a = 2, b = 3; void swap(int* x, int* y); printf("before:%d,%d\n", a, b); swap(&a, &b); printf("later:%d,%d\n", a, b); return 0; } void swap(int* x, int* y) { int tmp; //這裏使用了‘*’表示操做的是指針x,y所指向變量的內容(即變量a,b的內容) tmp = *x; *x = *y; *y = tmp; }
運行結果:
對引用的操做等於對其指定的對象進行操做,當將實參傳遞給形參時,形參就指向了實參(形參與實參同義,是它的一個別名)
1 #include <stdio.h> 2 void swap(int& a, int& b) 3 { 4 int tmp; 5 tmp = a; 6 a = b; 7 b = tmp; 8 } 9 10 int main() 11 { 12 int i = 3, j = 4; 13 printf("before swap:i=%d,j=%d\n", i, j); 14 swap(i, j); 15 printf("After swap:i=%d,j=%d\n", i, j); 16 return 0; 17 }
運行結果:
至於指針/引用傳遞的格式,能夠參考如下的內容:
1 int x=1; 2 3 int *y=&x; //用於指針傳遞,y有本身獨立的內存地址,存儲的內容是x的地址,*y是x的值 4 5 int &z=x; //用於引用傳遞,能夠理解爲z就是x,x就是z,只不過名字不同
最後再囉嗦一個例子:
1 #include <iostream> 2 using namespace std; 3 int change1(char* name){ 4 name = "alter"; 5 return 1; 6 } 7 8 int change2(char* &name){ 9 name = "alter"; 10 return 1; 11 } 12 13 int main(){ 14 char* string ="original!"; 15 change1(string); 16 cout << string <<'\n'; 17 18 change2(string); 19 cout << string << '\n'; 20 21 }
運行結果:
change1是值傳遞,形參name有本身獨立的內存地址,修改後name的內容變成了「alter」的地址(但string的內容仍是」original!「)。
change2是引用傳遞,形參name的地址就是string的地址,或者說name就是string。