搜尋

首頁  >  問答  >  主體

c++ - 在C中,int *p的*p是什么类型?

比如

int i=2, *p=&i;

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

PHP中文网PHP中文网2767 天前980

全部回覆(7)我來回復

  • 怪我咯

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

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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 12:03:00

    p的型別是pointer

    回覆
    0
  • 阿神

    阿神2017-04-17 12:03:00

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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 12:03:00

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

    int i = 2, 
        *p = &i;
    

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

    int &a = i;
    

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

    int& someFunc(int &b)
    

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 12:03:00

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

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

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

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

    感覺題主思維非常嚴謹,學C++就是要這樣,才能深度地理解每一個語句的意思,才能不被其“坑害”,而更好地去靈活運用它。願你能愛上C++。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 12:03:00

    & 這個符號在「修飾」【類型】和【變數】的時候意思不一樣。

    • &a 是取 a 的位址

    • int &b = a 是定義一個變量,它是引用(注意這裡不是 int &b = &a

    回覆
    0
  • 高洛峰

    高洛峰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* .

    回覆
    0
  • 取消回覆