2016-09-15 2 views
2

Wenn ich den fließenden Code bearbeiten:Warum ist neu (*) [2] verboten?

int (*p)[2] = new int [2][2]; //it's right. 
int (*q)[2] = new int (*)[2]; //it's wrong. 
//the wrong message:error: expected primary-expression before ')' token. 
//compile by g++ in Code::Blocks,Debug. 

kann ich die ersten verstehen. Aber warum kann der zweite nicht funktionieren?

Wie stimmt der Compiler mit dem Typ überein? Offensichtlich passt es nicht wie die allgemeine Bedingung, und es muss einige Grenzen für neue geben. Ich glaube, ich ignoriere einige Prinzipien.

+8

Was denkst du (*)? oder sollte es tun? – Hayt

+1

Wenn ich neu einen Zeiger auf ein Array will, muss ich neu int [1] [2]? // Es ist meine andere Idee. – willaty

+0

Ein Zeiger auf ein Array ist 'new int []' Doing [2] [2] erstellt ein Array (der Größe 2) von Arrays (der Größe 2) – Hayt

Antwort

4

Ich habe das Problem hier sozusagen verwunden: das erste, was ich ausprobiert habe funktioniert, aber ich habe nicht den Einblick, warum es funktioniert. Sie müssen einfach nur Klammern hinzu:

int (**q)[2] = new (int (*)[2]); 

Beachten Sie auch, dass new ing ein T kehrt ein T*, so new ing einen Zeiger gibt einen Zeiger-zu-Zeiger.

+5

Ich denke, ich habe es: 'new int (*) [2]' wird als 'new []' wo geparst 'T' ist' int (*) ', was keinen Sinn ergibt. Ihre Version ist 'neu' mit' T = int (*) [2] 'Zeiger auf das Array von int. Sie ordnen also im Grunde 1 Zeiger auf Array. – bolov

+0

Ich denke, vielleicht die neue wird die Array-Typ und Nicht-Array-Typ unterscheiden. Ich überprüfe: new int [2] [2] und new (int [2] [2]) sind Arbeit.Einfügen der Klammern ist besser .Vielleicht erst nach dem Lesen des neuen Geräts kann ich mehr Details erfahren. – willaty

+1

Dinge sicher wäre besser mit 'mit T = int (*) [2]; T * q = neues T; ' – MSalters

Verwandte Themen