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