日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入浅出之函数的参数传递方式

發布時間:2024/9/27 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出之函数的参数传递方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 按值傳遞

按值傳遞也稱傳值,其傳遞形式是形參為普通變量,實參為表達式或變量,實參向形參賦值。

按值傳遞的特點是參數傳遞后,實參和形參不再有任何聯系。需要注意的是,此時實參是表達式,故形參不可能給實參賦值。函數被調用時,系統為形參分配相應的存儲單元,用于接受實參傳遞的數據。函數調用期間,形參和實參各自擁獨立的存儲丹云。函數電泳結束,系統回收分配給形參的存儲單元。

傳值調用的優點是函數調用對其外界的變量無影響,最多只能用return返回一個值,函數獨立性強。

#include <QCoreApplication> #include<iostream>using namespace std; // 函數聲明 void swap(int x, int y);int main(int argc, char *argv[]) {QCoreApplication aa(argc, argv);// 局部變量聲明int a = 100;int b = 200;cout << a << endl;cout << b << endl;// 調用函數來交換值swap(a, b);cout << a << endl;cout << b << endl;return aa.exec(); }/*!* \brief swap* \param x* \param y*/ void swap(int x, int y) {int temp;temp = x; /* 保存 x 的值 */x = y; /* 把 y 賦值給 x */y = temp; /* 把 x 賦值給 y */return; } 輸出結果: 100 200 100 200

雖然在函數內改變了 a 和 b 的值,但是實際上 a 和 b 的值沒有發生變化。?

2 按引用傳遞

按引用傳遞又稱傳引用。引用即變量的別名,對別名的訪問就是對別名所關聯的訪問,直接傳入對象而無需傳遞對象的地址,反之亦然,&稱為引用符。

int i; int &ai = i;// 定義int型引用ai是變量i的別名 ai = 15;//此時i的值也為15

使用引用應注意以下幾點:

1) 定義引用時,應同時對它初始化,使它與一個類型相同的已有變量關聯。

2) 一個引用與某變量關聯;

3)引用主要用做函數的形參和返回值?

#include <QCoreApplication>int max(int &x,int &y) {return x>y?x:y; }int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);int x = 10,y = 9;int res = max(x,y); // x,y為實參qDebug("%d",res);return a.exec(); }

x是實參a的醫用,y是實參b的引用,他們占用同一個內存單元,知識名稱不同。引用的主要特點如下:

1) 高效的傳遞參數,避免了傳值方式中的拷貝構造。引用傳遞實際上是傳地址;

2) return語句最多返回一個值,而使用引用的形式可以修改多個實參變量的值;?

3)使用引用形參可以避免拷貝大的類型的類類型對象或容器類型對象;

?3 按指針方式

指針傳遞本質上和值傳遞差不多,實際上是把實際的指針參數傳遞給函數中創建的形參指針。不同的地方在于,指針傳遞的情況時,可以通過再函數中通過形參指針的間址訪問對實際變量做出更改,這是值傳遞無法做到的。

指針的行為和其他非引用類型一樣。當執行指針的拷貝操作時,拷貝的是指針的值。拷貝之后,兩個指針是不同的指針。可以通過指針修改所指對象的值,傳入的是變量對象的地址的拷貝

#include <QCoreApplication>int max(int *x,int *y) {return *x>*y?*x:*y; }int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);int x = 10,y = 9;int res = max(&x,&y); // x,y為實參qDebug("%d",res);return a.exec(); }

4?指針和引用的區別?

(1)指針:指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元;而引用跟原來的變量實質上是同一個東西,只不過是原變量的一個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了一個整形變量和一個指針變量p,該指針變量指向a的存儲單元,即p的值是a存儲單元的地址。

而下面2句定義了一個整形變量a和這個整形a的引用b,事實上a和b是同一個東西,在內存占有同一個存儲單元。

(2)可以有const指針,但是沒有const引用;

(3)指針可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)

(4)指針的值可以為空,但是引用的值不能為NULL,并且引用在定義的時候必須初始化;

(5)指針的值在初始化后可以改變,即指向其它的存儲單元,而引用在進行初始化后就不會再改變了。

(6)"sizeof引用"得到的是所指向的變量(對象)的大小,而"sizeof指針"得到的是指針本身的大小;

(7)指針和引用的自增(++)運算意義不一樣;

5 三種傳遞方式內存分析?

#include "stdafx.h" #include <iostream>using namespace std;//值傳遞 void swap1(int p,int q) {int temp;temp=p;p=q;q=temp; }//指針傳遞,函數體內只有指針值的變化 void swap2(int *p,int *q) {int temp;temp=*p;*p=*q;*q=temp; }//指針傳遞,函數體內只有指針的變化 void swap3(int *p,int *q) {int *temp;temp=p;p=q;q=temp; }//引用傳遞 void swap4(int &p,int &q) {int temp;temp=p;p=q;q=temp; }int main() { int a=1,b=2;swap1(a,b);//swap2(&a,&b);//swap3(&a,&b);//swap4(a,b);cout<<a<<" "<<b<<endl;return 0; }

5.1.值傳遞

swap1函數實現的值傳遞,值傳遞傳遞的是實際參數的一個副本,如果對這句話不理解,那一步步調試看下內存分配情況。

執行到48行時,a和b的情況如下

接著進入swap1函數體內,如下所示

可以看到的是,p和q的地址和a與b的地址不一樣,只是把a和b的值拷貝過去了,在swap1中對p和q操作只是對臨時分配的棧中內容進行操作,函數執行完后形參就消失了,對原來的a和b不產生任何影響。所以swap1不能完成交換a和b值的功能

5.2.指針傳遞

swap2和swap3都是指針傳遞,swap2函數體內交換了p和q指向地址的值,swap3函數體內交換了p和q指向的地址。

先說swap2,進入swap2函數體內,如下所示

可以看到,形參指針p和q指向的是a和b的地址,而不是像值傳遞那樣將實參的值拷貝到另外分配的地址中,運行到函數尾時,如下圖

可以看到、指針p和q指向的地址沒變,但地址中的值變了,也即a和b地址中的變了,就是a和b的值成功交換,繼續調試可以看到正確的結果,如下圖

再來看swap3,swap3運行到函數尾時的情況如下

可以看到p和q交換了地址,但最后函數執行完后的結果又如下所示

a和b的值并未交換,這是為什么呢?

swap3中,形參p和q會保存在棧中,p指向a的地址,q指向b的地址,使用temp指針完成了p和q的地址交換,即p指向b的地址,q指向了a的地址,但a和b地址中的值并未發生變化,這與swap2不同,swap2中是p指向的地址中的值(就是a)與q指向的地址中的值(b)交換,所以swap2執行完后a和b的值是交換了的。

5.3.引用傳遞

引用傳遞時,對形參的操作等同于對實參的操作,即傳遞的不會是實參的副本,而就是實參,進入swap4函數體內如下所示

看到這個內存分配,很明了了吧。最后會交換a和b的值。

參考:

  • C/C++中函數參數傳遞詳解
  • 總結

    以上是生活随笔為你收集整理的深入浅出之函数的参数传递方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。