天天看點

C/C++中的函數傳參

函數參數

函數參數有實參和形參之分。

實參,顧名思義就是實際參數。是函數調用時,實際傳入函數的值。

形參,就是形式參數。是函數定義或聲明時,提示需要傳入什麼樣的參數。形參的生命周期與該函數的使用相同,也就是說,函數結束時,釋放形參的記憶體。

example:

#include <stdio.h>

void fun(int data_2)//data_2為形參 
{
	
}
int main()
{
	int data=9;
	fun(data_1);//data_1為實參,實際上是執行一次指派操作,也就是data_2=data_1
				//注意data_2的改變與data_1的改變無關。 
	return 0;
}
           

接下來是重點!!

怎麼樣才能通過形參來改變實參的值呢?

大緻有三種方法

一,全局變量

二,傳指針

三,傳引用

上面的都不是重點

下面的才是

重點解釋---------函數傳指針的引用-----------

首先看函數傳指針

example:

#include <stdio.h>

void fun(int *p)
{
	*p=1;
	p=NULL;
}
int main()
{
	int data=0;
	int* p=&data; 
	fun(p); 
	printf("%d",(p==NULL));//輸出0 
	printf("%d",data);//輸出1 
	return 0;
}
           

上面的代碼挺簡單的,就是通過傳位址改變data的值,但是注意,p并沒用變成空指針,因為函數能夠通過位址找到在記憶體中的data,并可以對其進行操作,但是指針函數中的p是形參,與主函數中的p是兩碼事。但是兩個指針都指向同樣的位址。

下面改變代碼

#include <stdio.h>

void fun(int *&p1)
{
	*p1=1;
	p1=NULL;
}
int main()
{
	int data=0;
	int* p=&data; 
	fun(p); 
	printf("%d",(p==NULL));//輸出1
	printf("%d",data);//輸出1 
	return 0;
}
           

改為傳指針的引用,即時int*&p,輸出結果就變了,因為此次傳遞是傳遞主函數中指針p的引用,也就是說主函數的指針p和函數中的指針p1是同一個指針,也指向同一個位址。也可以了解成傳參時,執行了p1=&p,在函數中改變p1中儲存的位址,也就改變了主函數中p儲存的位址。