c++ - 在C中,int *p的*p是什么类型?
PHP中文网
PHP中文网 2017-04-17 12:01:00
0
7
1004

比如

int i=2, *p=&i;

在c++中,*p这个表达式的类型是int的引用即int &,而c中并没有引用这个概念,所以在c中*p的类型是什么?难道是int?如果是这样的话太搞了吧

PHP中文网
PHP中文网

认证0级讲师

全部回覆(7)
刘奇
int i=2;
int * p=&i; // ①int* p和int *p都一样

其中後一句又等同於

int * p;
p = &i; //③

再加上一句程式碼方便說明:

*p = 23; //②此时i也等于23

①透過int * p定義出來的是p而不是*pp的型別是指向int型別的指標(int *)。
②此處的*是取值運算符,操作/取出p所指向的位址的值。 這和①中定義用的*完全是兩個東西!不要混淆!
③C中&是取地址符,此句把i的地址賦給了p(而不是*p,把定義和初始化的操作分開就很容易看懂了)

並沒有*p是什麼類型的說法,非要說的話,此處p是指向int類型資料的指針,那麼*p算是int型別吧。

Peter_Zhu

p的型別是pointer

阿神

*p某種意義上算是int &p 間接引用

Peter_Zhu

三種&的情況有必要區分一下。

int i = 2, 
    *p = &i;

這裡i類型為intp類型為int**p類型為int

int &a = i;

這裡a的型別也是int,而不是int&

int& someFunc(int &b)

這裡b型別為int&,函數回傳值型別也是int&

大家讲道理

當時剛學習C++指標的時候,跟題主有一模一樣的困惑。那時我總覺得,對p取內容(即運算子)等於對i取位址,那p本身豈不是指向位址的指標了。或者說,假定和&像+和-一樣互為逆運算,如果把*移到右邊,不就有兩個&了嗎。去分析引用的話,更奇怪。 。 。

實際上,正如zodiacg回答中的黑體字部分所說的那樣定義指針和引用變數時所使用的*和&純粹只是個標記,並沒有任何取內容和取地址的意思,跟操作符沒有任何關係
也就是說

int i = 2;
int* p = &i;
*i = 0;
int& r = i;

第二行和第三行中的*性質不一樣,前者只是一個類型修飾符,而後者是跟+操作符一樣的一個操作符,二者沒有任何關係,只是標準中這麼規定而已。第四行和第二行的&也是同理。

感覺題主思維非常嚴謹,學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):

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* .

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板