亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++基礎入門教程(八):函數指針

2020-01-26 15:11:15
字體:
來源:轉載
供稿:網友

最近事情比較多,其實并不忙,就是事情比較影響思緒,所以都沒心思寫文章了。
今天主要說說函數的一些基本情況吧,同時也解釋一下新手最容易迷糊的――什么時候要用指針參數?

一、函數原型和函數定義

大家都知道,C++定義函數之前,還需要聲明函數原型,對于習慣Java等其他高級語言的朋友來說,真心覺得這很煩人。
如下代碼:

復制代碼 代碼如下:

// 聲明函數原型
void startGame(int param);
// 函數定義
void startGame(int param)
{
    // 各種邏輯
}

函數原型主要是給編譯器用的,在編譯的時候會通過函數原型來檢查函數返回值、參數數量、參數類型等。
總而言之,方便編譯器,編譯器爽了,我們才能更爽。

但實際中,函數原型也方便我們快速理解某個類的功能。

這些很簡單,就不多嘮叨了。

二、const限定符與指針

之前也有簡單介紹過const,比如 const int num = 10; 那么num就是常量,不可再次進行賦值操作了。
如果把const用在指針上呢?

復制代碼 代碼如下:

    int num = 10;
    const int *p = #
 
    // 編譯會報錯
    *p = 100;

如上代碼,編譯的時候就會報錯,因為指針p指向一個const int類型,這是一個常量。
所以*p的值是一個常量,不能被修改。

再來理一理,不然等會會混亂的:
1.p是一個指針
2.p指向一個內存地址,這個地址里存放的是一個const int類型的值
3.*p代表是p指向的內存地址里存放的那個值
4.所以,*p就是一個const int類型的值
5.綜上所述,*p不能再次被賦值。

這里要區分p和*p,這是兩個概念,一個是指針,一個是指針指向的值。
p是可以被再次賦值的,但是*p是不能被賦值的。

三、函數的指針參數

先來看看下面的代碼:

復制代碼 代碼如下:

void notChangeNum(int num);
void changeNum(int* num);
int _tmain(int argc, _TCHAR* argv[])
{
    int num = 10;
  
    // 這個函數不會改變num的值
    notChangeNum(num);
    cout << num << endl;
    // 這個函數會改變num的值
    int* p = #
    changeNum(p);
    cout << num << endl;
    return 0;
}
void notChangeNum(int num)
{
    // 參數不是指針
    num = 999;
}
void changeNum(int* num)
{
    // 參數是指針
    *num = 999;
}

這里有兩個函數,一個是普通參數(值傳遞),一個是指針參數(地址傳遞)。

第一個notChangeNum函數是不會改變num的值的,因為num傳遞給函數時,是拷貝了一份新的值,原來的num是不受影響的。

當離開notChangeNum函數后,函數的num參數會被釋放。

第二個changeNum函數的參數是指針,我們都知道,指針是指向某個內存地址的,所以,函數的參數指向的內存地址就是num的內存地址。

直接修改內存地址上的值,會影響原來的num,所以,離開changeNum函數后,num的值也會被改變,最終值是999.

這就是指針參數的作用,某些情況下,我們希望函數里對參數的修改能夠真正產生影響。

四、為什么要使用指針參數

為什么要用指針作為參數呢?因為指針可以直接指向內存地址,可以直接在函數里修改值,并且離開函數后仍然生效。
說是這么說,但,肯定還有人會迷糊,為什么呢?為什么要這樣呢?

比如,我們的函數參數是某個類:

復制代碼 代碼如下:

void play(Sprite* sp) {
}

Sprite和Value都是Cocos2d-x常用的,這里的參數為什么是指針?
因為值引用的參數是會拷貝一份的,這樣才不會影響原本的值,拷貝一份就會有額外的開銷。
一般類的開銷都比較大(相對于int、float等基本類型而言),所以拷貝一份不太合適。
而且我們通過都需要在函數里改變Sprite的坐標、大小等屬性,如果使用值傳遞的話,就無法修改了(修改的只是拷貝的那一份)。

當然,這個還要看具體項目的情況,我不嘮叨了,太深入不好吹水。

五、不想拷貝,又不想值被修改,怎么辦?

拷貝開銷大,使用指針參數又很可能在函數被修改了值,怎么辦呢?
這時候就要用const限定符了,如下代碼:

復制代碼 代碼如下:

void play(const Sprite* sp) {
}

這樣在函數內部既不會修改sp指向的值,又可以避免值傳遞的額外開銷。

六、函數內部的變量離開函數時就會被釋放

我們之前說過,只要不是new出來的變量,那么,在離開作用范圍后,就會被自動釋放。
但是,來看看這個函數:

復制代碼 代碼如下:

int getNum() {
    int num = 10;
    return num;
}

既然變量離開作用范圍后會被釋放,那么,num在離開getNum函數后,就會被釋放。
這時候return num的意義何在呢?getNum函數真的能成功獲取到數字10嗎?
答案是肯定的。

因為return 在返回num的時候,實際上是拷貝了一份的,返回的是拷貝的值,釋放的是原來的變量。
這就是return的秘密了。

但是,指針就不行了,看看下面的代碼:

復制代碼 代碼如下:

// 假設有這樣一個結構體
struct People {
   int age;
};
People* getNewPeople() {
    People nPeople;
    nPeople.age = 20;
    return &nPeople;
}

這個函數返回的是一個指向People結構體類型的內存地址。
按照return的規則,返回的時候實際上是拷貝了一份,但這個時候拷貝的只是一個指針,也就是一個內存地址。
這個內存地址仍然指向函數內部的nPeople變量。

所以即使getNewPeople函數成功返回了一個指針,但這個指針指向的內存地址上的值仍然是被釋放了。
也就是說,我們獲取的只是一個野指針。

七、結束

好了,這篇寫得有點糟糕,太多內容了,我只是抽取部分來吹吹水~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费视频观看| 久久99久久久久久久噜噜| 久久久成人的性感天堂| 欧美高清视频在线| 亚洲人精品午夜在线观看| 国产免费一区二区三区在线能观看| 精品国偷自产在线视频| 91av成人在线| 日韩av电影在线播放| 国产精品99久久久久久久久| 国产999在线| 成人黄色av网| 日韩一级黄色av| 欧美精品999| 亚洲黄色有码视频| 国产精品白丝jk喷水视频一区| 色中色综合影院手机版在线观看| 久久久久北条麻妃免费看| 亚洲女人天堂色在线7777| 久久久久国色av免费观看性色| 亚洲性线免费观看视频成熟| 色偷偷88888欧美精品久久久| 日本精品久久久久影院| 91亚洲精品久久久久久久久久久久| 这里只有精品在线观看| 日韩精品视频在线| 91夜夜未满十八勿入爽爽影院| 成人免费xxxxx在线观看| 欧美激情一二三| 色播久久人人爽人人爽人人片视av| 一区二区三区天堂av| 亚洲国产成人久久| 国产精品无av码在线观看| 日本久久久久久| 欧美性xxxx| 久久国内精品一国内精品| 亚洲国产精品电影在线观看| 久久精品99国产精品酒店日本| 国产一区二区三区三区在线观看| 久久精品在线播放| 日本欧美一二三区| 亚洲成人在线视频播放| 久久99久久99精品免观看粉嫩| 国产91精品黑色丝袜高跟鞋| 福利一区视频在线观看| 成人福利网站在线观看| 奇米4444一区二区三区| 国产精品久久久久久久app| 欧美国产高跟鞋裸体秀xxxhd| 国产精品福利无圣光在线一区| 欧美网站在线观看| 久久成年人视频| 欧美噜噜久久久xxx| 欧美亚州一区二区三区| 亚洲免费av片| 欧美视频不卡中文| 久久久久一本一区二区青青蜜月| 1769国内精品视频在线播放| 久久久久久999| 国产伦精品一区二区三区精品视频| 久久久久999| 亚洲日本中文字幕免费在线不卡| 欧美精品在线极品| 精品国产依人香蕉在线精品| 国产精品旅馆在线| 亚洲无限乱码一二三四麻| 人妖精品videosex性欧美| 97在线免费视频| 国产精品吹潮在线观看| 成人激情视频小说免费下载| 日韩一区视频在线| 福利一区福利二区微拍刺激| 成人444kkkk在线观看| 国产精品福利网站| 一区二区在线免费视频| 欧美激情2020午夜免费观看| 97视频在线播放| 日韩欧美中文第一页| 精品国产一区二区三区在线观看| 超薄丝袜一区二区| 国产亚洲精品一区二555| 亚洲欧美日韩天堂一区二区| www.久久撸.com| 日韩视频在线观看免费| 另类美女黄大片| 美女视频久久黄| 51ⅴ精品国产91久久久久久| 精品久久久久久中文字幕| 狠狠色狠狠色综合日日五| 日韩在线视频观看| 91麻豆桃色免费看| 国产精品久久久久久久久男| 亚洲日本中文字幕免费在线不卡| 欧美成人在线免费| 成人乱人伦精品视频在线观看| 成人美女免费网站视频| 久久久女人电视剧免费播放下载| 国产欧美日韩免费看aⅴ视频| 国产精品久久久久99| 欧美日韩一区二区在线播放| 亚洲免费视频一区二区| 欧洲中文字幕国产精品| 91精品久久久久久久久久久久久久| 麻豆乱码国产一区二区三区| 亚洲男子天堂网| 欧美日韩国产成人在线| 免费91在线视频| 欧美一级大片在线观看| 久久中文字幕在线视频| 国产精品小说在线| 日韩美女写真福利在线观看| 亚洲国产99精品国自产| 久久影视电视剧免费网站清宫辞电视| 亚洲国产另类 国产精品国产免费| 欧美激情精品久久久久久免费印度| 中文字幕日韩高清| 亚洲午夜精品久久久久久性色| 亚洲大胆人体在线| 亚洲在线免费视频| 成人网址在线观看| 亚洲欧洲黄色网| 91av视频在线| 国产精品男女猛烈高潮激情| 日韩网站免费观看高清| 国产成人自拍视频在线观看| 国产精品美女免费视频| 欧美多人乱p欧美4p久久| 美日韩丰满少妇在线观看| 欧美久久精品午夜青青大伊人| 久久亚洲国产精品成人av秋霞| 中文在线资源观看视频网站免费不卡| 欧美一级高清免费| 中文字幕亚洲字幕| 在线日韩欧美视频| 亚洲三级黄色在线观看| 色午夜这里只有精品| 欧美乱人伦中文字幕在线| 精品亚洲一区二区三区在线播放| 国产精品成人一区二区| 欧美激情xxxxx| 亚洲伊人久久综合| 久久资源免费视频| 欧美日韩免费在线| 久久精品视频导航| 韩国19禁主播vip福利视频| 中文字幕日韩在线视频| 日韩欧美一区二区三区久久| 久久精品影视伊人网| 国产成人免费av| 亚洲国产成人爱av在线播放| 国产日韩专区在线| 久久精品中文字幕一区| 久久久精品亚洲| 欧美成人精品xxx| 一区二区在线视频| 亚洲欧洲第一视频| 久热精品视频在线观看| 色婷婷久久av| 91a在线视频| 成人精品久久一区二区三区| 色综合久久天天综线观看| 亚洲的天堂在线中文字幕| 日韩在线www| 3344国产精品免费看|