主要說一下c++指標和引用在使用過程中需要注意的一些地方。
一、指標
1.指標其實就是記憶體位址,資料(無論是int/long/char等各種型別)儲存在記憶體中,必然有找到儲存資料的辦法,這個辦法就是找到儲存這部分記憶體的位址就可以了。找到了位址就找到就找到了放到位址中的內容,這就是指標的功能。在c/c++中指標就是記憶體位址,取出位址中存放的內容的符號也是比較形象的,-> 是不是很像乙個箭頭!通過這個符號就可以取出當前位址下的內容。
當然了,還可以使用解引用,使用*來取出位址中的內容;
2.作為指標經常被作為引數傳遞,比如:
#include //求arg1+arg2=sum把結果儲存到sum中
void testadd(int* arg1, int*arg2, int*sum);
int main()
void testadd(int* arg1, int*arg2, int*sum)
輸出結果:12+5=17
通過記憶體位址可以看到:
引數傳遞的確是傳遞的同乙個位址中的內容。
以上計算是通過指標完成的。但是如果不適應指正呢?直接傳值會怎樣?我們過載一下函式:
void testadd(int arg1, int arg2, int sum);
void testadd(int arg1, int arg2, int sum)
執行一下,檢視結果:
發現各個引數的位址都不一樣了,而且計算的結果也不對。這是因為在呼叫函式testadd時,系統會在函式內部自動的分配同型別的臨時變數,並且把傳遞的引數複製給生成的臨時變數。之後再函式中對這些變數的使用其實是對生成的臨時變數的使用,與原來的變數不是同乙個變數了。他們是位於記憶體中不同位址的不同變數。所以在函式中的變數和呼叫函式之外的變數雖然型別名字一樣,但是不是同一塊記憶體。因此結果也是不正確的。
二、引用
1.如果我們把上面的函式在修改一下,傳遞的引數改為引用。
void testadd(int&arg1, int&arg2, int&sum);
void testadd(int&arg1, int&arg2, int&sum)
然後執行一下,檢視結果:
返現執行也是正確的。
引用其實作用和指標的作用是一樣的,指標是位址,引用是別名。舉個例子:我給張三起了另外乙個名字叫張三三,當我叫張三或者張三三時,他們都是同乙個人。引用就是這樣。
引數傳遞的是引用,在函式內部使用這個別名變數任然是函式外面定義的別名。在函式內部對這個變數的操作,也就是對在函式外部變數的操作。它們是記憶體中的同一塊記憶體,只不過是不同的名稱而已。
但是如果返回的是引用呢?網上很多人都說不要返回區域性變數的引用,返回又如何?舉個例子:
int& testadd(int arg1, int arg2);
int& testadd(int arg1, int arg2)
編寫完成之後,會在第一次編譯的時候,出現如下警告:
warning c4172: 返回區域性變數或臨時變數的位址
忽略警告直接執行:
呼叫前和呼叫後的記憶體位址是不一樣的,但是結果確實正確的。這是因為放返回的變數是臨時變數的時候,臨時變數會在函式呼叫完成後就釋放掉記憶體了。返回時會重新分配一塊同型別的記憶體一儲存返回值。所以記憶體位址會不一樣。
2.返回值是引用,對引用的操作
直接上**,看下面的例子:
#include int gsum = 0;
int& testadd(int arg1, int arg2);
int main()
int& testadd(int arg1, int arg2)
gsum的值是17還是18?看列印出來的結果:
gsum=17並且sum的位址和gsum的位址也是不一樣的,為什麼呢?這是因為testadd函式雖然返回的是引用,但是接收返回值的並不是引用,認識具體的乙個變數,相當於又重新分配了一塊記憶體,然後給分配這塊記憶體重新賦值。這塊記憶體和gsum是不同的記憶體位置。
那麼如果我想返回也是gsum呢,那麼就要接收返回值的地方必須也是定義為引用。
int&sum = testadd(arg1, arg2);//要定義成引用
重新執行一下:
sum和gsum的結果位址一樣的,對sum的操作也就是對gsum的操作。sum就是gsum的別名引用。
以上!
C 指標和引用
在深入介紹之前我們首先來看一下指標和引用的定義 指標和引用的區別,然後分別針對指標和引用展開討論,深入細節為何有這些差異。指標和引用的定義,下面用通俗易懂的話來概述一下 而宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。其次,引用不可以改變指向,對乙個物件...
C 引用和指標
引用和指標看上去差不多,看上去差不多,其實男寶寶和女寶寶是不一樣的 用起來還是有一定差距。本人菜鳥僅將遇到的問題記錄備案,以便日後翻查 ptrfunc.h ifndef ptrfunc h define ptrfunc h typedef int func int,int struct aa end...
C 指標和引用
有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能 到目前為止我們介紹過函式引數傳遞的兩種情況 1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的 如果在執行函式期間形參的值發生變化,並不傳回給實參 因為在呼叫函式時,形參和實...