c++中的*
與&
對於初學者來說,確實有點讓人搞懵。因為在變數的定義和呼叫時,*
和&
都會表現出不一樣的含義。
*
在定義時是宣告該變數是乙個指標,例如
int *p; //那p就是乙個int型的指標。
例1:
int a = 0; int *p = a; //那p的值就是a的位址。
上面的原因是int a = 0; int *p = a;
實際上是int a = 0; int *p = &a;
這兩者是等價的!!!
int *p = &a;
時,c語言本身提供了可以略去&
的簡寫,但是本人不是很喜歡這樣的寫法,因為這樣會誤導初學者!
所以大家還是寫全比較規範一點,寫完int *p = &a
,這樣比較好。
c++就沒有這樣的簡寫機制,大家可以測試一下。
*在呼叫時是指標指向的那個變數,是取值運算子。
例2:
int a = 0; int *p = &a; printf("*p = %d\n", *p);
&
在定義時是定義乙個引用,例如:int a = 0; int &b = a;
那麼b
就是a
的引用,即b=0
;如果再給a
賦值a=10
,則b
也會變為10
;如果給b
賦值b=20
,則a
也會變為20
;
&
在呼叫時是乙個取位址運算子。例如:int a = 0; printf("&a = %p\n", &a);
會列印出a
的位址,這個位址因為變數a
在各個計算機的位址的不一樣,所以列印的也不一樣。
上述的四條語句,前面兩個很好理解,而後面兩個,大部分c++初學者都會比較困惑,今天我也是查閱了一些資料以後才恍然大悟。下面具體來說明一下:&
在呼叫時還有一種與運算,如:int a = 0; a&=0;
//按位與操作,這個就不細說了
int i;
int *a = &i;//這裡a是乙個指標,它指向變數i
int &b = i;//這裡b是乙個引用,它是變數i的引用,引用是什麼?它的本質是什麼?下面會具體講述
int * &c = a;//這裡c是乙個引用,它是指標a的引用
int & *d;//這裡d是乙個指標,它指向引用,但引用不是實體,所以這是錯誤的
引用就是指標,兩者沒有區別。我們可以把引用想象成乙個不需要*
就可以訪問變數的指標,對比如下程式:
void function(int *a)
int main()
void function(int &a)
int main()
以上兩段程式完成的功能是一樣的。
我在寫這兩句語句時,在int
和*(&)
間空了一格,而後面的&(*)
緊跟a
。原因是:分析此類語句時,最簡單的辦法就是從右往左讀,離變數名最近的符號對其型別有最直接的影響,即先看a
前緊跟的是什麼,它決定了a
的型別。例如,對於int & *a
,此處是*
,表示其首先是個指標,指標的型別是乙個int型引用。而int
後的乙個空格是為了防止int *a, b;//a是指標,而b不是
。
它的功能和int * &a
一樣,兩者生成的二進位制**一樣。這再一次說明了引用就是指標。
c++的*與&簡單總結
uboot下記憶體操作指令mw和md
md指令 uboot下輸入指令md,會提示md的用法,memory display,即記憶體顯示。u boot petalinux md md memory display usage md b,w,l address of objects b 8位 w 16位 l 32位 預設值 示例 上述0x1...
uboot下記憶體操作指令mw和md
md指令 uboot下輸入指令md,會提示md的用法,memory display,即記憶體顯示。u boot petalinux md md memory display usage md b,w,l address of objects b 8位 w 16位 l 32位 預設值 示例 上述0x1...
c C 基礎的總結
c 面向過程 c語言 物件導向 但是c 中也有 物件導向 和過程 c 佔位符 ld輸出長整形格式 u 十進位制無符號整數 f 浮點數 s 字串 c 單個字元 p 指標的值 1 define 與 define 的區別 define 是首先在指定的目錄去尋找,然後去系統盤尋找 define 是直接去系統...