newはint型のポインタをメモリに確保する。
int* ptr = new int;
つまり、int一個分の領域をヒープに確保するわけだ。
int* ptr = new int[1];
C++で一次元配列int[]はint*と同じなので、配列のサイズが増えても書き方は同じ。
int* ptr = new int[100];
メモリ上にどんだけ確保してもptrに返るのはその先頭アドレスとなる。

で、次に下の書き方ではintのポインタをメモリに確保する。
 int** ptr = new int*;
これは上の同じ理屈でこう書ける。つまりintのポインタ一個分を確保するってこと。
 int** ptr = new int*[1];
当然、サイズが増えても先頭のポインタは変化しないので、こう↓かける
 int** ptr = new int*[100];

括弧に関してはワカラン。「そういう文法だから」でいいんじゃね?
だって、普通の変数の宣言で
 (int*) ptrInt=NULL;
なんて書き方できないっしょ?