C與C++的比較:參數(shù)傳遞


1. C語言

1.1 一般參數(shù)

#include <stdio.h>

void f(int i) // 置0
{
    printf("f   : %p %d\n", &i, i);
    i = 0;
    printf("f   : %p %d\n", &i, i);
}

int main()
{
    int a = 1;
    printf("main: %p %d\n", &a, a);
    f(a);
    printf("main: %p %d\n", &a, a);

    return 0;
}
運(yùn)行結(jié)果

分析:因?yàn)閷?shí)參地址(0022FEDC)和形參地址(0022FEC0)不同,所以實(shí)參p和形參i不是同一變量攒菠。修改i不會(huì)改變a。

1.2 指針參數(shù)

#include <stdio.h>

void f(int *i) // 修改指針
{
    printf("f   : %p %p %d\n", &i, i, *i);
    int m = 0;
    i = &m;
    printf("f   : %p %p %d\n", &i, i, *i);
}

int main()
{
    int a = 1;
    int *p = &a;
    printf("main: %p %p %d\n", &p, p, *p);
    f(p);
    printf("main: %p %p %d\n", &p, p, *p);

    return 0;
}
運(yùn)行結(jié)果

分析:因?yàn)閷?shí)參指針地址(0022FED8)和形參指針地址(0022FEC0)不同,實(shí)參p和形參i是兩個(gè)不同的指針命浴。因?yàn)閜和i的值相等,都是0022FEDC,所以它們指向同一變量生闲。修改i不會(huì)改變p媳溺。

#include <stdio.h>

void f(int *i) // 修改指針指向的值
{
    printf("f   : %p %p %d\n", &i, i, *i);
    *i = 0;
    printf("f   : %p %p %d\n", &i, i, *i);
}

int main()
{
    int a = 1;
    int *p = &a;
    printf("main: %p %p %d\n", &p, p, *p);
    f(p);
    printf("main: %p %p %d\n", &p, p, *p);

    return 0;
}
運(yùn)行結(jié)果

分析:因?yàn)閷?shí)參指針地址(0022FED8)和形參指針地址(0022FEC0)不同,實(shí)參p和形參i是兩個(gè)不同的指針碍讯。因?yàn)閜和i的值相等悬蔽,都是0022FEDC,所以它們指向同一變量捉兴。修改*i會(huì)改變*p蝎困。

1.3 數(shù)組參數(shù)

#include <stdio.h>

void f(int i[]) // 修改數(shù)組i
{
    printf("f   : %p %p %d\n", &i, i, *i);
    int m = 0;
    i = &m;
    printf("f   : %p %p %d\n", &i, i, *i);
}

int main()
{
    int a[3] = {1, 2, 3};
    printf("main: %p %p %d\n", &a, a, *a);
    f(a);
    printf("main: %p %p %d\n", &a, a, *a);

    return 0;
}
運(yùn)行結(jié)果
#include <stdio.h>

void f(int i[]) // 修改數(shù)組元素i[0]
{
    printf("f   : %p %p %d\n", &i, i, *i);
    i[0] = 0;
    printf("f   : %p %p %d\n", &i, i, *i);
}

int main()
{
    int a[3] = {1, 2, 3};
    printf("main: %p %p %d\n", &a, a, *a);
    f(a);
    printf("main: %p %p %d\n", &a, a, *a);

    return 0;
}
運(yùn)行結(jié)果

分析:傳遞數(shù)組,實(shí)際是傳遞數(shù)組起始元素的位置或地址倍啥。實(shí)參a與形參i是兩個(gè)不同的數(shù)組名禾乘,但它們的值都是0022FED4,指向同一變量虽缕。修改i不會(huì)改變a盖袭,修改i[0]才會(huì)改變a[0]。

1.4 總結(jié)

  1. 在C語言中彼宠,所有函數(shù)參數(shù)都是值傳遞鳄虱,地址也是一種值。函數(shù)調(diào)用時(shí)凭峡,實(shí)參的被賦給形參拙已,修改形參不會(huì)改變實(shí)參。
  2. 傳遞指針實(shí)際是傳遞變量的地址摧冀。形參和實(shí)參是不同指針倍踪,但指向同一變量。修改形參不會(huì)改變實(shí)參索昂,修改形參指向的變量會(huì)改變實(shí)參指向的對(duì)象建车。
  3. 傳遞數(shù)組實(shí)際是傳遞數(shù)組起始元素的地址。與指針類似椒惨,修改形參不會(huì)改變實(shí)參缤至,修改形參的數(shù)組元素會(huì)改變實(shí)參的數(shù)組元素。

2. C++語言

2.1 一般參數(shù)

#include "iostream"
using namespace std;

void f(int i) // 置0
{
    cout << "f   : " << &i << " " << i << endl;
    i = 0;
    cout << "f   : " << &i << " " << i << endl;
}

int main()
{
    int a = 1;
    cout << "main: " << &a << " " << a << endl;
    f(a);
    cout << "main: " << &a << " " << a << endl;

    return 0;
}
運(yùn)行結(jié)果

分析:&a是0x22fecc康谆,&i是0x22feb0领斥,a和i是不同變量,修改a不會(huì)改變i沃暗。

2.2 指針參數(shù)

#include "iostream"
using namespace std;

void f(int *i) // 修改指針
{
    cout << "f   : " << &i << " " << i << " " << *i << endl;
    int m = 0;
    i = &m;
    cout << "f   : " << &i << " " << i << " " << *i << endl;
}

int main()
{
    int a = 1;
    int *p = &a;
    cout << "main: " << &p << " " << p << " " << *p << endl;
    f(p);
    cout << "main: " << &p << " " << p << " " << *p << endl;

    return 0;
}
運(yùn)行結(jié)果
#include "iostream"
using namespace std;

void f(int *i) // 修改指針指向的變量
{
    cout << "f   : " << &i << " " << i << " " << *i << endl;
    i[0] = 0;
    cout << "f   : " << &i << " " << i << " " << *i << endl;
}

int main()
{
    int a = 1;
    int *p = &a;
    cout << "main: " << &p << " " << p << " " << *p << endl;
    f(p);
    cout << "main: " << &p << " " << p << " " << *p << endl;

    return 0;
}
運(yùn)行結(jié)果

分析:傳遞指針時(shí)月洛,會(huì)將實(shí)參拷貝給形參。形參i與實(shí)參p是兩個(gè)不同的指針孽锥,它們都指向同一變量a嚼黔。修改i不會(huì)改變p细层,修改*i會(huì)改變*p。

2.3 數(shù)組參數(shù)

#include "iostream"
using namespace std;

void f(int i[]) // 修改數(shù)組
{
    cout << "f   : " << &i << " " << i << " " << *i << endl;
    int m[3] = {0, 0, 0};
    i = m;
    cout << "f   : " << &i << " " << i << " " << *i << endl;
}

int main()
{
    int a[3] = {1, 2, 3};
    cout << "main: " << &a << " " << a << " " << *a << endl;
    f(a);
    cout << "main: " << &a << " " << a << " " << *a << endl;

    return 0;
}
運(yùn)行結(jié)果
#include "iostream"
using namespace std;

void f(int i[]) // 修改數(shù)組元素
{
    cout << "f   : " << &i << " " << i << " " << *i << endl;
    i[0] = 0;
    cout << "f   : " << &i << " " << i << " " << *i << endl;
}

int main()
{
    int a[3] = {1, 2, 3};
    cout << "main: " << &a << " " << a << " " << *a << endl;
    f(a);
    cout << "main: " << &a << " " << a << " " << *a << endl;

    return 0;
}
運(yùn)行結(jié)果

分析:傳遞數(shù)組時(shí)唬涧,實(shí)際上傳遞的是指向數(shù)組首元素的指針今艺。形參i與實(shí)參a是兩個(gè)不同的指針,它們都指向同一變量爵卒。修改i不會(huì)改變a虚缎,修改i[0]會(huì)改變a[0]。

2.4 引用參數(shù)

#include "iostream"
using namespace std;

void f(int &i) // 修改i
{
    cout << "f   : " << &i << " " << i << endl;
    i = 0;
    cout << "f   : " << &i << " " << i << endl;
}

int main()
{
    int a = 1;
    cout << "main: " << &a << " " << a << endl;
    f(a);
    cout << "main: " << &a << " " << a << endl;

    return 0;
}
運(yùn)行結(jié)果

分析:形參i是引用類型钓株,i引用a实牡,即i是a的別名。對(duì)i的操作實(shí)際上是對(duì)a進(jìn)行操作轴合,故修改i會(huì)改變a创坞。

注意:C語言中,形參不能是引用類型受葛。

#include <stdio.h>

void f(int &i)
{
    printf("f   : %p %d\n", &i, i);
    i = 0;
    printf("f   : %p %d\n", &i, i);
}

int main()
{
    int a = 1;
    printf("main: %p %d\n", &a, a);
    f(a);
    printf("main: %p %d\n", &a, a);

    return 0;
}
編譯錯(cuò)誤
運(yùn)行錯(cuò)誤

2.5 總結(jié)

  1. 在C++中题涨,參數(shù)傳遞分為值傳遞引用傳遞兩種。程序調(diào)用函數(shù)時(shí)會(huì)創(chuàng)建形參总滩,并用實(shí)參對(duì)形參初始化纲堵。
  2. 傳遞數(shù)組實(shí)際上是傳遞指向數(shù)組首元素的指針。數(shù)組傳遞和指針傳遞都算是值傳遞闰渔。
  3. C++中形參可以是引用類型席函,C中不可以。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冈涧,一起剝皮案震驚了整個(gè)濱河市茂附,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌督弓,老刑警劉巖营曼,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異愚隧,居然都是意外死亡蒂阱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門奸攻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒜危,“玉大人虱痕,你說我怎么就攤上這事睹耐。” “怎么了部翘?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵硝训,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)窖梁,這世上最難降的妖魔是什么赘风? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮纵刘,結(jié)果婚禮上邀窃,老公的妹妹穿的比我還像新娘。我一直安慰自己假哎,他們只是感情好瞬捕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舵抹,像睡著了一般肪虎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惧蛹,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天扇救,我揣著相機(jī)與錄音,去河邊找鬼香嗓。 笑死迅腔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靠娱。 我是一名探鬼主播钾挟,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饱岸!你這毒婦竟也來了掺出?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤苫费,失蹤者是張志新(化名)和其女友劉穎汤锨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體百框,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闲礼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铐维。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬泽。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嫁蛇,靈堂內(nèi)的尸體忽然破棺而出锨并,到底是詐尸還是另有隱情,我是刑警寧澤睬棚,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布第煮,位于F島的核電站解幼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏包警。R本人自食惡果不足惜撵摆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望害晦。 院中可真熱鬧特铝,春花似錦、人聲如沸壹瘟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俐筋。三九已至牵素,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澄者,已是汗流浹背笆呆。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粱挡,地道東北人赠幕。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像询筏,于是被迫代替她去往敵國(guó)和親榕堰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容