NDK開發(fā)---C++學習(二):引用

前言

說到引用料饥,對于Android開發(fā)工程師來說蒲犬,肯定是不陌生的。比如Java中我們聲明一個Person person岸啡,這里就是person就是Person的引用原叮,可以讓person = new Person("張三"),即person這個引用指向了"張三"這個對象凰狞。

引用概念

大家都知道篇裁,變量名實質(zhì)上是一段連續(xù)存儲空間的別名,是一個標號(門牌號)赡若,那么可能有人會問了达布,那能不能有多個別名呢?答案是肯定的逾冬,也就是說可以有多個引用黍聂,引用即變量的別名。

引用的作用

1.可以從函數(shù)中返回多個值身腻。
2.可以修改實參值本身产还,不需要像值傳遞那樣,函數(shù)處理的是實參數(shù)本地的副本嘀趟。
3.傳遞地址可以節(jié)省復制大量數(shù)據(jù)的內(nèi)存空間和時間脐区。
大家看完引用的作用,可能一臉懵逼她按,但是這不要緊牛隅,當看完下面的例子,再回頭來看酌泰,必然會有不一樣的體會媒佣。

引用的初次相識

#include<iostream>
using namespace std;
void main() {
    //變量名就相當于門牌號(也就是內(nèi)存空間的別名,那可不可以有多個名字陵刹?)
    int a = 10;
    //b就是這個內(nèi)存空間的另外一個別名
    //C++中的一個引用(C中是沒有引用的)
    int &b = a;
    cout << b << endl;

    getchar();
}

這里變量b就是a的引用默伍,用&加以標識。在C中是沒有引用的概念的,引用是在C++中增加的也糊。

引用的應用:

1.值交換

我們先來看看值交換的指針寫法:

#include<iostream>
//指針值交換
void swap_1(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

再讓我們來看看值交換的引用寫法:

//引用值交換
void swap_2(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

主函數(shù)main調(diào)用值交換函數(shù):

void main() {
    int x = 10;
    int y = 20;

    printf("%d, %d\n", x, y);
    //swap_1(&x, &y);
    //a成了x的別名炼蹦,b成了y的別名
    swap_2(x, y);
    printf("%d, %d\n", x, y);

    getchar();
}

打印的結(jié)果:

10, 20
20, 10

這里驗證了引用作用的第二條,引用改變的是參數(shù)本身显设,而不是參數(shù)的副本框弛。因為這里我們打印的是變換之前x和y的值、變換之后x和y的值捕捂,如果不是改變參數(shù)本身瑟枫,這里打印的應該都是10和20。

注意:
由于引用參數(shù)傳遞的是實參的地址指攒,因此在調(diào)用函數(shù)時慷妙,不能向引用參數(shù)傳遞常數(shù)。比如此例中的swap_2(x, y)允悦,如果寫成swap_2(10, 20)就是錯誤的膝擂。

2.代替二級指針

先來看看二級指針的例子:
先定義一個結(jié)構(gòu)體:

#include<iostream>
struct Teacher {
    char* name;
    int age;
};

二級指針的寫法


void getTeacher(Teacher **p) {
    Teacher *temp = (Teacher*)malloc(sizeof(Teacher));
    temp->age = 20;
    *p = temp;
}

然后我們再來看看引用是怎樣代替二級指針的:

void getTeacher(Teacher* &p) {
    p = (Teacher*)malloc(sizeof(Teacher));
    p->age = 40;
}
void main() {
    Teacher *t = NULL;
    //getTeacher(&t);
    getTeacher(t);
    printf("%d\n", t->age);

    getchar();
}

打印的結(jié)果分別是20、40隙弛。
是不是簡單了好多呢架馋?

指針常量與常量指針

指針常量

#include<iostream>
void main() {
    //指針常量,指針的常量:不能改變地址全闷,但是可以修改它指向的內(nèi)容
    int a = 2, b = 3;
    int *const p1 = &a;
    //p1 = &b;  //這樣是不行的
    *p1 = 4;
    printf("%d\n", *p1);
}

指針常量叉寂,不能改變地址,但是可以修改它指向的內(nèi)容

常量指針

#include<iostream>
void main() {
    //常量指針总珠,指向常量的指針:能改變地址屏鳍,但是不可以修改它指向的內(nèi)容
    const int *p2 = &a;
    p2 = &b;
    //*p2 = 4;  //這樣是不行的
    getchar();
}

常量指針,能改變地址局服,但是不可以修改它指向的內(nèi)容

3.常引用

#include<iostream>
using namespace std;
void myPrintf(const int &d) {
    cout << d << endl;
}
void main() {
    //const int a;
    //引用必須要有值钓瞭,不能為空
    //int &a = NULL;

    //常引用
    int a = 3, b = 4;
    const int &c = a;
    //c = b;    //常引用不能再重新被賦值

    //字面量
    const int &d = 70;
    myPrintf(c);

    getchar();
}

注意:
1.常引用類似于Java中的final
2.引用必須要有值,不能為空
3.常引用不能再重新賦值
4.常引用作為函數(shù)的參數(shù)
5.常引用作為字面量來使用

指針是變量的地址淫奔,引用是變量的別名

#include<iostream>
using namespace std;
struct Teacher {
    char name[20];
    int age;
};

void main() {
    Teacher t;
    Teacher &t1 = t;
    Teacher *t2 = &t;
    
    cout << sizeof(t1) << endl;     //24
    cout << sizeof(t2) << endl;     //4

    getchar();
}

打印結(jié)果為:

24
4

由打印結(jié)果我們知道t1是24字節(jié)山涡,t2是4字節(jié),而該結(jié)構(gòu)體是20(name) + 4(age) = 24字節(jié)唆迁,指針是4字節(jié)佳鳖,我們就可以得出:
指針是變量的地址,引用是變量的別名

展望

本篇博客主要介紹了C++中的引用媒惕,接下來我將介紹C++中的類與函數(shù),由于篇幅較長来庭,故分為上妒蔚、中、下三篇,敬請期待肴盏!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末科盛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菜皂,更是在濱河造成了極大的恐慌贞绵,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恍飘,死亡現(xiàn)場離奇詭異榨崩,居然都是意外死亡,警方通過查閱死者的電腦和手機章母,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門母蛛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乳怎,你說我怎么就攤上這事彩郊。” “怎么了蚪缀?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵秫逝,是天一觀的道長。 經(jīng)常有香客問我询枚,道長违帆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任哩盲,我火速辦了婚禮前方,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘廉油。我一直安慰自己惠险,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布抒线。 她就那樣靜靜地躺著班巩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘶炭。 梳的紋絲不亂的頭發(fā)上抱慌,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音眨猎,去河邊找鬼抑进。 笑死,一個胖子當著我的面吹牛睡陪,可吹牛的內(nèi)容都是我干的寺渗。 我是一名探鬼主播匿情,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼信殊!你這毒婦竟也來了炬称?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涡拘,失蹤者是張志新(化名)和其女友劉穎玲躯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳄乏,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡跷车,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了汞窗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姓赤。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仲吏,靈堂內(nèi)的尸體忽然破棺而出不铆,到底是詐尸還是另有隱情,我是刑警寧澤裹唆,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布誓斥,位于F島的核電站,受9級特大地震影響许帐,放射性物質(zhì)發(fā)生泄漏劳坑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一成畦、第九天 我趴在偏房一處隱蔽的房頂上張望距芬。 院中可真熱鬧,春花似錦循帐、人聲如沸框仔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽离斩。三九已至,卻和暖如春瘪匿,著一層夾襖步出監(jiān)牢的瞬間跛梗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工棋弥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留核偿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓顽染,卻偏偏與公主長得像宪祥,于是被迫代替她去往敵國和親聂薪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,519評論 1 51
  • 重新系統(tǒng)學習下C++蝗羊;但是還是少了好多知識點;socket仁锯;unix耀找;stl;boost等业崖; C++ 教程 | 菜...
    kakukeme閱讀 19,903評論 0 50
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型野芒。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)双炕; ...
    朱森閱讀 3,446評論 3 44
  • 軟件最新版本:#1.2# 本次更新說明:#新增播放音樂功能# 更新下載鏈接:#http://fir.im/yz2u#
    小宇xy閱讀 276評論 0 0
  • 20分鐘的動漫狞悲,有2分半是OP,有2分鐘是ED妇斤,中間再加5分鐘的前情回顧——縮水的可以摇锋;連續(xù)劇也是,10分鐘一個廣...
    化物有生閱讀 519評論 0 0