比如
int i=2, *p=&i;
在c++中,*p
这个表达式的类型是int的引用即int &
,而c中并没有引用这个概念,所以在c中*p
的类型是什么?难道是int
?如果是这样的话太搞了吧
怪我咯2017-04-17 12:03:00
int i=2;
int * p=&i; // ①int* p和int *p都一样
其中後一句又等同於
int * p;
p = &i; //③
再加上一句程式碼方便說明:
*p = 23; //②此时i也等于23
①透過int * p
定義出來的是p
而不是*p
,p
的型別是指向int型別的指標(int *
)。
②此處的*
是取值運算符,操作/取出p
所指向的位址的值。 這和①中定義用的*
完全是兩個東西!不要混淆!
③C中&
是取地址符,此句把i
的地址賦給了p
(而不是*p
,把定義和初始化的操作分開就很容易看懂了)
並沒有*p
是什麼類型的說法,非要說的話,此處p
是指向int類型資料的指針,那麼*p
算是int型別吧。
天蓬老师2017-04-17 12:03:00
三種&
的情況有必要區分一下。
int i = 2,
*p = &i;
這裡i
類型為int
,p
類型為int*
,*p
類型為int
。
int &a = i;
這裡a
的型別也是int
,而不是int&
。
int& someFunc(int &b)
這裡b
型別為int&
,函數回傳值型別也是int&
。
大家讲道理2017-04-17 12:03:00
當時剛學習C++指標的時候,跟題主有一模一樣的困惑。那時我總覺得,對p取內容(即運算子)等於對i取位址,那p本身豈不是指向位址的指標了。或者說,假定和&像+和-一樣互為逆運算,如果把*移到右邊,不就有兩個&了嗎。去分析引用的話,更奇怪。 。 。
實際上,正如zodiacg回答中的黑體字部分所說的那樣定義指針和引用變數時所使用的*和&純粹只是個標記,並沒有任何取內容和取地址的意思,跟操作符沒有任何關係。
也就是說
int i = 2;
int* p = &i;
*i = 0;
int& r = i;
第二行和第三行中的*性質不一樣,前者只是一個類型修飾符,而後者是跟+操作符一樣的一個操作符,二者沒有任何關係,只是標準中這麼規定而已。第四行和第二行的&也是同理。
感覺題主思維非常嚴謹,學C++就是要這樣,才能深度地理解每一個語句的意思,才能不被其“坑害”,而更好地去靈活運用它。願你能愛上C++。
PHP中文网2017-04-17 12:03:00
&
這個符號在「修飾」【類型】和【變數】的時候意思不一樣。
&a
是取 a 的位址
int &b = a
是定義一個變量,它是引用(注意這裡不是 int &b = &a
)
高洛峰2017-04-17 12:03:00
你的概念錯的離譜,不過我先不想講 p 的類型是 int*,因為拉個二年級小學生都知道,我想說怎麼理解 C style 的類型定義。
以題目中為例,讀懂這個型別就像是解方程式 int *p
表示 *p 的型別是 int,既然 p 指向一個 int,那麼 p 就是一個儲存一個 int 型變數的位址的變數。這個太簡單了,所以上一點稍微複雜的:char*(*p[10])(int**)
,開始「解方程式」(a : t 表示 a 的型別是 t):
char*(*p[10])(int**)
=> p : char*(*[10])(int**)
=> p[0..9] : char*(*)(int**)
=> *(p[0..9]) : char*(int**)
已經推出結果,p 是0 -> 9 的數組,其中儲存的是指針,且該指針指向一個函數,函數的類型為char*(int**) 即為int** => char* .