C/C++語言引數傳遞----值傳遞、引用傳遞、指標傳遞、指標引用傳遞
阿新 • • 發佈:2019-01-26
1.值傳遞
void f( int p){
printf("\n%x",&p);
printf("\n%x",p);
p=0xff;
}
void main()
{
int a=0x10;
printf("\n%x",&a);
printf("\n%x\n",a);
f(a);
printf("\n%x\n",a);
}
通過上例我們可以看到,int a=0x10,存放的地址為0x12ff44,值為10,當呼叫f(a)時,傳遞給p的值為10,但是p的地址為0x12fef4,當改變p=0xff,時是改變地址為0x12fef4中的內容,並沒有改變0x12ff44中的內容,所以呼叫f(a),後a的值仍然為0x10,所以值傳遞無法改變變數的值。示意圖如下:
2.引用傳遞
void f( int & p){
printf("\n%x",&p);
printf("\n%x",p);
p=0xff;
}
void main()
{
int a=0x10;
printf("\n%x",&a);
printf("\n%x\n",a);
f(a);
printf("\n%x\n",a);
}
通過上面引用傳遞傳遞案例我們可以看到,呼叫f(a)時,傳遞給p的是a的地址,所以p和a的地址都是0X12ff44,所以p就是a,改變p當然能改變a。示意圖如下:
3.指標傳遞
void f( int*p){ printf("\n%x",&p); printf("\n%x",p); printf("\n%x\n",*p); *p=0xff; } void main() { int a=0x10; printf("\n%x",&a); printf("\n%x\n",a); f(&a); printf("\n%x\n",a); }
通過指標傳遞的案例我們可以看到,呼叫f(&a)是將a的地址0x12ff44傳遞給p,則*p就指向了a的內容,改變*p後,a的內容自然就改變了,示意圖如下:
4.指標的引用傳遞
void f( int*&p){ printf("\n%x",&p); printf("\n%x",p); printf("\n%x\n",*p); *p=0xff; } void main() { int a=0x10; printf("\n%x",&a); printf("\n%x\n",a); int *b=&a; printf("\n%x",&b); printf("\n%x",b); printf("\n%x\n",*b); f(b); printf("\n%x\n",a); }
為了使用指標的引用傳遞我們要新建一個指標b,然後將b的引用傳遞給p,其實p就是b的一個拷貝,*p=*b都指向a,所以改變*p的內容也就改變a的內容。示意圖如下:
我們再來看一下如果不用指標的引用傳遞會出現什麼結果void f( int*p){
printf("\n%x",&p);
printf("\n%x",p);
printf("\n%x\n",*p);
*p=0xff;
}
void main()
{
int a=0x10;
printf("\n%x",&a);
printf("\n%x\n",a);
int *b=&a;
printf("\n%x",&b);
printf("\n%x",b);
printf("\n%x\n",*b);
f(b);
printf("\n%x\n",a);
printf("\n%x\n",b);
}
從結果中我們可以看到呼叫f(b)時,傳遞給p的是b的內容,但是&b,和&p是不一樣的,雖然*p和*b都指向a。示意圖如下:
5.錯誤案例
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void Allocate(char* p,int size){
printf("\n%x",&p);
printf("\n%x",p);
p=(char*)malloc(size);
}
void Free(char* p){
free(p);
}
void main()
{
char *str=NULL;
printf("\n%X",&str);
printf("\n%X",str);
Allocate(str,100);
strcpy(str,"Hello World!");
printf("\n%s",str);
Free(str);
printf("\nstr=%s",str);
}
當執行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.正確案例
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void Allocate(char*& p,int size){
printf("\n%x",&p);
printf("\n%x",p);
p=(char*)malloc(size);
}
void Free(char* p){
free(p);
}
void main()
{
char *str=NULL;
printf("\n%X",&str);
printf("\n%X",str);
Allocate(str,100);
strcpy(str,"Hello World!");
printf("\n%s",str);
Free(str);
}
因為指標引用傳遞的是指標的拷貝,所以&str和&p,是地址是一樣的,所以對p分配內容空間也就是對str分配空間,所以沒有問題!