2016-05-15 5 views
0

* (Arrayname + i) ist Für den folgenden Code, warum Arrayname [i] in diesem Fall ungleich * (Arrayname + i) und die Ausgabe kann sein seltsam:Warum ArrayName [i] in diesem Fall nicht in C++

#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

Ihr Code ist Ihre Frage nicht überein. Sie geben richtig an, dass 'a [i]' dasselbe ist wie '* (a + i)'. Ihr Code enthält 'pfish [0]', was nach dieser Regel mit '* (pfish + 0)' übereinstimmt. So weit, ist es gut. Aber dann enthält dein Codebeispiel '(* pfish.kind)' ', was völlig anders als' * (pfish + 0) 'ist. –

+0

@ M.M Ja ich sehe, danke. Ich habe einfach nicht bemerkt, dass (* pfish.kind) anders ist als (* pfish) .kind –

Antwort

4

Der . Betreiber und -> Betreiber haben eine höhere Priorität als einstellige * Betreiber.

Sie haben Klammern hinzuzufügen * vor dem Zugriff auf Mitglieder berechnet zu haben, wie

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

(* pfish) .kind gleich pfish [0] .kind

* pfish.kind gleich * (pfish.kind), und pfish ist vom Zeigertyp, Sie müssen also den Operator -> anstelle des Operators verwenden., um auf das Mitglied zuzugreifen, und der Compiler hat sich darüber beschwert.

Auch * pfish-> Art ist * (pfish-> Art), Pfish-> Art ist "abcd" vom Typ char [10], so dereferencnig ist es ein char, es ist gleich pfish-> Art [ 0], so hat es nur 'a' ausgegeben.

C++ Operator Vorrang: http://en.cppreference.com/w/cpp/language/operator_precedence

Verwandte Themen