There are two issues with your code:
1) [] has more precedence than * so you need parenthesis in all those cases (cfr. operator precedence). If you don't use them, you're going to do pointer-arithmetic on arrays of 2 integers each (thus immediately getting out-of-range), e.g.
int(*t)[2]; // A pointer to an array of 2 integers
cout << t[0]; // The address of the array
[first_integer][second_integer] ... garbage memory ...
^
cout << t[1]; // The address of the array + sizeof(int[2])
[first_integer][second_integer] ... garbage memory ...
^
cout << *t[0]; // Dereference at the address of the array
cout << *t[1]; // Dereference past the end of the array
// ---- correct -----
cout << (*t)[0]; // Dereference the pointer to the array and get the element there
[first_integer][second_integer] ... garbage memory ...
^
cout << (*t)[1]; // Dereference the pointer to the array and get the second element there
[first_integer][second_integer] ... garbage memory ...
^
2) You have an out-of-range access at line
arr3[2] = { 66 };
This is how you should proceed:
//sample1
int arr[2] = { 11, 22 };
int(*t)[2];
t = &arr;
cout << (*t)[0] << "\n";
cout << (*t)[1] << "\n";
//sample2
int arr2[2];
arr2[0] = { 33 };
arr2[1] = { 44 };
int(*t2)[2];
t2 = &arr2;
cout << (*t2)[0] << "\n";
cout << (*t2)[1] << "\n";
//sample3
int arr3[2];
arr3[0] = { 55 };
arr3[1] = { 66 };
int(*t3)[2];
t3 = &arr3;
cout << (*t3)[0] << "\n";
cout << (*t3)[1] << "\n";
The initialization is just fine.
arr3[2] = { 66 };arr. You should read up on the precedence of the*and[]operators. (hint: it should be(*arr)[0]etc.)