牛客網刷題——傳址調用/引用調用/值傳遞

傳地址調用和傳引用調用的區別

相同點:
傳引用和傳地址,原理上都是將參數變量的地址傳遞給被調函數。所以在函數內部修改參數的值時,均可返回修改之後的結果給調用者。

不同點:
引用一定會指向一個對象,而指針可能爲空(NULL); 傳引用時,系統對傳過來的參數不會有任何額外開銷,直接使用原始變量的內存空間。
傳引用時,函數參數需要寫做T&a; 調用函數時直接傳遞對象本身;在函數內賦值的時候,直接對a賦值即可。
傳地址時,函數參數需要寫作T*p;調用函數時需要傳入對象地址; 賦值時需要對*p賦值。
總結
從以上對比可以得知,傳引用調用比傳地址調用更爲簡單高效。之所以保留傳地址調用,主要是爲了兼容C語言的代碼。在C++編程時,應儘量以傳引用代替傳地址。
————————————————
版權聲明:本文爲CSDN博主「Java星」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yangxingpa/article/details/77856370

以下是我在學習過程中遇到的傳遞地址調用的程序,自己寫了和引用傳遞調用的函數作對比,c++不精通,如果那裏錯了,還望指正,謝謝。

#include <iostream>
using namespace std;

//void splitFloat( float a,int &intPart, float &floatPart )
//{
//	intPart = ( int )( a );
//	floatPart = a - intPart;
//}

void splitFloat( float a,int *intPart, float *floatPart )
{
	*intPart = static_cast< int >( a );
	*floatPart = a - *intPart;
}

void add_Ref( int &x, float &y)
{
	x = 13;
	y = 14;
}
int main()
{
	cout << "Enter 3 float point numbers:" << endl;

	float x,f;
	int n;
	cin >> x;
	splitFloat( x, &n, &f);//傳地址調用:函數參數爲地址,需要定義指針指向這個地址
	cout << "Integer: " << n << "  Float: " << f << endl;//輸出整數部分和小數部分
	add_Ref( n, f);			//傳引用調用:函數參數爲變量名,函數形參定義爲引用
	cout << "n: " << n << "  f: " << f << endl;//輸出13,14

}

***************************************************************************************************************************************

2020.05.02更新

我是題目,from牛客網。

在C語言中,以下代碼執行之後,*p的值爲()

void func(int *p)
{
    static int num = 4;
    p = &num;
    (*p)--;
}
int main()
{
    int i = 5;
    int *p = &i;
    func(p);//p指向的是一個地址,傳地址調用
    printf("%d", *p);
    return 0;
}

 

這個程序中的p是傳遞的是地址,傳地址調用。

********************************************************************************************

2020/05/06 更新

我是題目,from牛客網

 

#include<iostream>
using namespace std;
void f(int *p,int *q)
{
	//p++;
    (*p)++;
    *q=*q+1;
}
int main()
{
    int m=1,n=2,*r=&m;
	cout << "r,&n: " << r << " " << &n << endl;
    f(r,&n);//n是傳引用調用
    cout<< m << "," << n << endl;
    return 0;
}

我們輸出r 和 &n會發現兩個都是地址,那麼函數f()就是將兩個地址傳遞給函數所定義的兩個指針,這兩個指針接收的參數都是地址,所以本質上他們是一樣的。

指針r傳遞至函數f()後,將m的地址傳遞給函數f(),f()中的指針p指向傳遞過來的m的地址,p++後指向m的下一個地址,沒有改變m的值,並且函數返回後,該指針被銷燬,m的值不變。

但如果是(*p)++ 那麼就會改變指針p指向地址中的內容,性質同*q = *q + 1 一樣了。

&n是引用傳遞,將n的地址傳遞給函數f(),並用指針指向改地址,*q = *q + 1是對q指針所指向地址中存儲的內容+1,即n值+1;而返回函數後,雖然q指針被銷燬,但是它所指向的地址中的內容已經改變。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章