C/C++語言參數傳遞----值傳遞、引用傳遞、指針傳遞、指針引用傳遞

1.值傳遞

  1. void f( int  p){  
  2.     printf("\n%x",&p);  
  3.     printf("\n%x",p);  
  4.     p=0xff;  
  5. }  
  6. void main()  
  7. {  
  8.     int a=0x10;  
  9.     printf("\n%x",&a);  
  10.     printf("\n%x\n",a);  
  11.     f(a);  
  12.     printf("\n%x\n",a);  
  13. }  


通過上例我們可以看到,int a=0x10,存放的地址爲0x12ff44,值爲10,當調用f(a)時,傳遞給p的值爲10,但是p的地址爲0x12fef4,當改變p=0xff,時是改變地址爲0x12fef4中的內容,並沒有改變0x12ff44中的內容,所以調用f(a),後a的值仍然爲0x10,所以值傳遞無法改變變量的值。示意圖如下:


2.引用傳遞

  1. void f( int & p){  
  2.     printf("\n%x",&p);  
  3.     printf("\n%x",p);  
  4.     p=0xff;  
  5. }  
  6. void main()  
  7. {  
  8.     int a=0x10;  
  9.     printf("\n%x",&a);  
  10.     printf("\n%x\n",a);  
  11.     f(a);  
  12.     printf("\n%x\n",a);  
  13. }  

通過上面引用傳遞傳遞案例我們可以看到,調用f(a)時,傳遞給p的是a的地址,所以p和a的地址都是0X12ff44,所以p就是a,改變p當然能改變a。示意圖如下:

3.指針傳遞

  1. void f( int*p){  
  2.     printf("\n%x",&p);  
  3.     printf("\n%x",p);  
  4.     printf("\n%x\n",*p);  
  5.     *p=0xff;  
  6. }  
  7. void main()  
  8. {  
  9.     int a=0x10;  
  10.     printf("\n%x",&a);  
  11.     printf("\n%x\n",a);  
  12.     f(&a);  
  13.     printf("\n%x\n",a);  
  14. }  



通過指針傳遞的案例我們可以看到,調用f(&a)是將a的地址0x12ff44傳遞給p,則*p就指向了a的內容,改變*p後,a的內容自然就改變了,示意圖如下:


4.指針的引用傳遞

  1. void f( int*&p){  
  2.     printf("\n%x",&p);  
  3.     printf("\n%x",p);  
  4.     printf("\n%x\n",*p);  
  5.     *p=0xff;  
  6. }  
  7. void main()  
  8. {  
  9.     int a=0x10;  
  10.     printf("\n%x",&a);  
  11.     printf("\n%x\n",a);  
  12.     int *b=&a;  
  13.     printf("\n%x",&b);  
  14.     printf("\n%x",b);  
  15.     printf("\n%x\n",*b);  
  16.     f(b);  
  17.     printf("\n%x\n",a);  
  18. }  



爲了使用指針的引用傳遞我們要新建一個指針b,然後將b的引用傳遞給p,其實p就是b的一個拷貝,*p=*b都指向a,所以改變*p的內容也就改變a的內容。示意圖如下:

我們再來看一下如果不用指針的引用傳遞會出現什麼結果
  1. void f( int*p){  
  2.     printf("\n%x",&p);  
  3.     printf("\n%x",p);  
  4.     printf("\n%x\n",*p);  
  5.     *p=0xff;  
  6. }  
  7. void main()  
  8. {  
  9.     int a=0x10;  
  10.     printf("\n%x",&a);  
  11.     printf("\n%x\n",a);  
  12.     int *b=&a;  
  13.     printf("\n%x",&b);  
  14.     printf("\n%x",b);  
  15.     printf("\n%x\n",*b);  
  16.     f(b);  
  17.     printf("\n%x\n",a);  
  18.     printf("\n%x\n",b);  
  19. }  


從結果中我們可以看到調用f(b)時,傳遞給p的是b的內容,但是&b,和&p是不一樣的,雖然*p和*b都指向a。示意圖如下:


5.錯誤案例


  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include <string.h>  
  4.   
  5. void Allocate(char* p,int size){  
  6.   
  7.     printf("\n%x",&p);  
  8.     printf("\n%x",p);  
  9.   
  10.     p=(char*)malloc(size);  
  11. }  
  12. void Free(char* p){  
  13.     free(p);  
  14. }  
  15. void main()  
  16. {  
  17.     char *str=NULL;  
  18.     printf("\n%X",&str);  
  19.     printf("\n%X",str);  
  20.     Allocate(str,100);  
  21.     strcpy(str,"Hello World!");  
  22.     printf("\n%s",str);  
  23.     Free(str);  
  24.     printf("\nstr=%s",str);  
  25.       
  26. }  



當執行strcpy(str,"Hello World!"),時會報Unhandled exception in CPoint.exe:0xC0000005:Access Violation,這是因爲我們參用的是指針傳遞,從運行結果我們可以看到str的地址爲0x12ff44,當調用Allocate(str,100)時,傳遞給p的是str,的內容也就是0,所以p爲0,但是&p並不是和&str一樣的,所以在運行p=(char*)malloc(size)時,是給0x12fef0分配的100個字節,並沒有給0x12ff44分配字節,所以*str還是空。所以會報錯。

5.正確案例

  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include <string.h>  
  4.   
  5. void Allocate(char*& p,int size){  
  6.     printf("\n%x",&p);  
  7.     printf("\n%x",p);  
  8.     p=(char*)malloc(size);  
  9. }  
  10. void Free(char* p){  
  11.     free(p);  
  12. }  
  13. void main()  
  14. {  
  15.     char *str=NULL;  
  16.     printf("\n%X",&str);  
  17.     printf("\n%X",str);  
  18.     Allocate(str,100);  
  19.     strcpy(str,"Hello World!");  
  20.     printf("\n%s",str);  
  21.     Free(str);    
  22. }  



因爲指針引用傳遞的是指針的拷貝,所以&str和&p,是地址是一樣的,所以對p分配內容空間也就是對str分配空間,所以沒有問題!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章