1. 程式人生 > >C/C++語言引數傳遞----值傳遞、引用傳遞、指標傳遞、指標引用傳遞

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

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分配空間,所以沒有問題!