2016-05-15 2 views
0

この場合、arrayname [i]が*(arrayname + i)と等しくないのはなぜですか?奇妙なこと:この場合、arrayname [i]が*(arrayname + i)と等しくないのはなぜですか?

#include <iostream> 
using namespace std; 

struct fish 
{ 
    char kind[10] = "abcd"; 
    int weight; 
    float length; 
}; 

int main() 
{ 
    int numoffish; 
    cout << "How many fishes?\n"; 
    cin >> numoffish; 
    fish *pfish = new fish[numoffish]; 
    cout << pfish[0].kind << endl; //the output is "abcd" 

    /*if the above code is changed to 
    "cout << (*pfish.kind);" 
    then compile error happens */ 

    /*and if the above code is changed to 
    "cout << (*pfish->kind);" 
    then the output is only an "a" instead of "abcd"*/ 

    delete [] pfish; 
    return 0; 
} 
+0

はあなたのコードでは、あなたの質問に一致していません。あなたは正しく 'a [i]'が '*(a + i)'と同じであることを正しく述べます。あなたのコードには 'pfish [0]'が含まれています。その規則によれば '*(pfish + 0)'と同じです。ここまでは順調ですね。しかし、コードサンプルに '(* pfish.kind)'が含まれています。これは '*(pfish + 0)'とまったく異なります。 –

+0

@ M.Mはい、ありがとう。私はちょうど(* pfish.kind)が(* pfish).kind –

答えて

4

.オペレータと->オペレータは単項*演算子より高い優先順位を持っています。

あなたが

cout << ((*pfish).kind); 
1

(* pfish)のようにアクセスするメンバーの前に*が計算持つように括弧を追加する必要が.kind [0] .kind

* pfish.kindがに等しいpfishに等しいです*(pfish.kind)、pfishはポインタ型なので、演算子ではなく、演算子- >を使用する必要があります。にアクセスしてコンパイラがそれに不平を言うようにしてください。

また* pfish->一種である*(pfish->一種)、pfish->種類は、それが文字であるdereferencnigので、一種> pfish-に等しく、タイプchar [10]の "ABCD" です[ 0]のため、 'a'のみを出力しました。

C++の演算子の優先順位:http://en.cppreference.com/w/cpp/language/operator_precedence

関連する問題